mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-04 15:39:42 +08:00

* chore: Switch to Node 20 + Vitest * chore: migrate to vitest mock functions * chore: code style (switch to prettier) * test: re-enable long-running test Seems the switch to Node 20 and Vitest has vastly improved the code's and / or the test's runtime! see #1193 * chore: code style * chore: fix failing tests * Updated Documentation in README.md * Update contribution guidelines to state usage of Prettier * fix: set prettier printWidth back to 80 * chore: apply updated code style automatically * fix: set prettier line endings to lf again * chore: apply updated code style automatically --------- Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
65 lines
1.9 KiB
JavaScript
65 lines
1.9 KiB
JavaScript
/**
|
|
* 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 }
|