diff --git a/DIRECTORY.md b/DIRECTORY.md index e6b0611ad..9ad7db4e0 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -210,6 +210,7 @@ * [Problem008](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem008.js) * [Problem009](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem009.js) * [Problem010](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem010.js) + * [Problem012](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem012.js) * [Problem014](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem014.js) * [Problem015](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem015.js) * [Problem016](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem016.js) diff --git a/Project-Euler/Problem012.js b/Project-Euler/Problem012.js new file mode 100644 index 000000000..9fb4ceb3b --- /dev/null +++ b/Project-Euler/Problem012.js @@ -0,0 +1,64 @@ +/** + * Problem 12 - Highly divisible triangular number + * + * https://projecteuler.net/problem=11 + * + * The sequence of triangle numbers is generated by adding the natural numbers. + * So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. + * + * The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... + * Let us list the factors of the first seven triangle numbers: + * + * 1: 1 + * 3: 1,3 + * 6: 1,2,3,6 + * 10: 1,2,5,10 + * 15: 1,3,5,15 + * 21: 1,3,7,21 + * 28: 1,2,4,7,14,28 + * + * We can see that 28 is the first triangle number to have over five divisors. + * + * What is the value of the first triangle number to have over five hundred divisors? +*/ + +/** + * Gets number of divisors of a given number + * @params num The number whose divisors to find + */ +const getNumOfDivisors = (num) => { + // initialize numberOfDivisors + let numberOfDivisors = 0 + + // if one divisor less than sqrt(num) exists + // then another divisor greater than sqrt(n) exists and its value is num/i + const sqrtNum = Math.sqrt(num) + for (let i = 0; i <= sqrtNum; i++) { + // check if i divides num + if (num % i === 0) { + if (i === sqrtNum) { + // if both divisors are equal, i.e., num is perfect square, then only 1 divisor + numberOfDivisors++ + } else { + // 2 divisors, one of them is less than sqrt(n), other greater than sqrt(n) + numberOfDivisors += 2 + } + } + } + return numberOfDivisors +} + +/** + * Loops till first triangular number with 500 divisors is found + */ +const firstTriangularWith500Divisors = () => { + let triangularNum + // loop forever until numOfDivisors becomes greater than or equal to 500 + for (let n = 1; ; n++) { + // nth triangular number is (1/2)*n*(n+1) by Arithmetic Progression + triangularNum = (1 / 2) * n * (n + 1) + if (getNumOfDivisors(triangularNum) >= 500) return triangularNum + } +} + +export { firstTriangularWith500Divisors } diff --git a/Project-Euler/test/Problem012.test.js b/Project-Euler/test/Problem012.test.js new file mode 100644 index 000000000..2fd1f8d89 --- /dev/null +++ b/Project-Euler/test/Problem012.test.js @@ -0,0 +1,8 @@ +import { firstTriangularWith500Divisors } from '../Problem012' + +describe('checkFirstTriangularWith500Divisors()', () => { + it('Problem Statement Answer', () => { + const firstTriangular = firstTriangularWith500Divisors() + expect(firstTriangular).toBe(76576500) + }) +})