diff --git a/Project-Euler/Problem026.js b/Project-Euler/Problem026.js new file mode 100644 index 0000000000..684f1c55a1 --- /dev/null +++ b/Project-Euler/Problem026.js @@ -0,0 +1,56 @@ +/** + * Problem - Longest Recurring Cycle + * + * @see {@link https://projecteuler.net/problem=26} + * + * Find the value of denominator < 1000 for which 1/denominator contains the longest recurring cycle in its decimal fraction part. + */ + +/** + * Main function to find the denominator < limit with the longest recurring cycle in 1/denominator. + * + * @param {number} limit - The upper limit for the denominator (exclusive). + * @returns {number} The denominator that has the longest recurring cycle in its decimal fraction part. + */ +function findLongestRecurringCycle(limit) { + /** + * Calculates the length of the recurring cycle for 1 divided by a given denominator. + * + * @param {number} denominator - The denominator of the unit fraction (1/denominator). + * @returns {number} The length of the recurring cycle in the decimal part of 1/denominator. + */ + function getRecurringCycleLength(denominator) { + const remainderPositions = new Map() + let numerator = 1 + let position = 0 + + while (numerator !== 0) { + if (remainderPositions.has(numerator)) { + return position - remainderPositions.get(numerator) + } + + remainderPositions.set(numerator, position) + + numerator = (numerator * 10) % denominator + position++ + } + + return 0 + } + + let maxCycleLength = 0 + let denominatorWithMaxCycle = 0 + + for (let denominator = 2; denominator < limit; denominator++) { + const cycleLength = getRecurringCycleLength(denominator) + + if (cycleLength > maxCycleLength) { + maxCycleLength = cycleLength + denominatorWithMaxCycle = denominator + } + } + + return denominatorWithMaxCycle +} + +export { findLongestRecurringCycle } diff --git a/Project-Euler/Problem027.js b/Project-Euler/Problem027.js new file mode 100644 index 0000000000..d1d27aa3b2 --- /dev/null +++ b/Project-Euler/Problem027.js @@ -0,0 +1,51 @@ +/** + * Problem - Quadratic Primes + * + * @see {@link https://projecteuler.net/problem=27} + * + * The quadratic expression n^2 + an + b, where |a| < 1000 and |b| ≤ 1000, + * produces a positive prime for consecutive values of n, starting with n = 0. + * Find the product of the coefficients, a and b, for the quadratic expression that + * produces the maximum number of primes for consecutive values of n. + */ + +/** + * Main function to find the coefficients a and b that produce the maximum number + * of consecutive primes for the quadratic expression n^2 + an + b. + * + * @returns {{maxPrimes: number, product: number}} An object containing the maximum number of primes + * and the product of coefficients a and b. + */ +function findMaxConsecutivePrimes() { + function isPrime(n) { + if (n < 2) return false + if (n === 2) return true + if (n % 2 === 0) return false + for (let i = 3; i <= Math.sqrt(n); i += 2) { + if (n % i === 0) return false + } + return true + } + + let maxPrimes = 0 + let product = 0 + + for (let a = -999; a < 1000; a++) { + for (let b = -1000; b <= 1000; b++) { + let n = 0 + while (true) { + const result = n * n + a * n + b + if (result < 0 || !isPrime(result)) break + n++ + } + if (n > maxPrimes) { + maxPrimes = n + product = a * b + } + } + } + + return { maxPrimes, product } +} + +export { findMaxConsecutivePrimes } diff --git a/Project-Euler/Problem029.js b/Project-Euler/Problem029.js new file mode 100644 index 0000000000..f24da79dd6 --- /dev/null +++ b/Project-Euler/Problem029.js @@ -0,0 +1,39 @@ +/** + * Problem - Distinct Powers + * + * Find the number of distinct terms generated by a^b for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100. + */ + +/** + * Main function to count distinct powers a^b. + * + * @param {number} minA + * @param {number} maxA + * @param {number} minB + * @param {number} maxB + * @returns {number} + */ +function countDistinctPowers(minA, maxA, minB, maxB) { + /** + * Set to store distinct terms generated by a^b. + */ + const distinctTerms = new Set() + + for (let a = minA; a <= maxA; a++) { + for (let b = minB; b <= maxB; b++) { + distinctTerms.add(Math.pow(a, b)) + } + } + + return distinctTerms.size +} + +const minA = 2 +const maxA = 100 +const minB = 2 +const maxB = 100 + +const result = countDistinctPowers(minA, maxA, minB, maxB) +console.log(`Number of distinct terms: ${result}`) + +export { countDistinctPowers } diff --git a/Project-Euler/Problem030.js b/Project-Euler/Problem030.js new file mode 100644 index 0000000000..d53aba8097 --- /dev/null +++ b/Project-Euler/Problem030.js @@ -0,0 +1,33 @@ +/** + * Problem - Sum of Fifth Powers of Digits + * + * Find the sum of all the numbers that can be written as the sum of fifth powers of their digits. + * + * @see {@link https://projecteuler.net/problem=30} + */ + +/** + * Main function to calculate the sum of all numbers that can be expressed + * as the sum of the fifth powers of their digits. + * + * @returns {number} The sum of all numbers that can be written as the sum of fifth powers of their digits. + */ +function sumOfFifthPowers() { + const fifthPowers = Array.from({ length: 10 }, (_, i) => i ** 5) + const results = [] + + for (let num = 10; num < 354295; num++) { + const sumOfDigits = num + .toString() + .split('') + .reduce((sum, digit) => sum + fifthPowers[digit], 0) + + if (sumOfDigits === num) { + results.push(num) + } + } + + return results.reduce((acc, curr) => acc + curr, 0) +} + +export { sumOfFifthPowers } diff --git a/Project-Euler/test/Problem026.test.js b/Project-Euler/test/Problem026.test.js new file mode 100644 index 0000000000..67f60c2b48 --- /dev/null +++ b/Project-Euler/test/Problem026.test.js @@ -0,0 +1,16 @@ +import { findLongestRecurringCycle } from '../Problem026' + +/** + * Tests for the findLongestRecurringCycle function. + */ +describe('findLongestRecurringCycle', () => { + it.each([ + { limit: 10, expected: 7 }, + { limit: 1000, expected: 983 }, // The denominator with the longest cycle for limit of 1000 + { limit: 4, expected: 3 }, + { limit: 2, expected: 0 } // No cycle for fractions 1/1 and 1/2 + ])('should return $expected for limit of $limit', ({ limit, expected }) => { + const result = findLongestRecurringCycle(limit) + expect(result).toBe(expected) + }) +}) diff --git a/Project-Euler/test/Problem027.test.js b/Project-Euler/test/Problem027.test.js new file mode 100644 index 0000000000..f7859f03d6 --- /dev/null +++ b/Project-Euler/test/Problem027.test.js @@ -0,0 +1,9 @@ +import { findMaxConsecutivePrimes } from '../Problem027' + +describe('Problem 027 - Quadratic Primes', () => { + test('should return the correct product of coefficients for max consecutive primes', () => { + const { maxPrimes, product } = findMaxConsecutivePrimes() + expect(maxPrimes).toBe(71) + expect(product).toBe(-59231) + }) +}) diff --git a/Project-Euler/test/Problem029.test.js b/Project-Euler/test/Problem029.test.js new file mode 100644 index 0000000000..428ce1813d --- /dev/null +++ b/Project-Euler/test/Problem029.test.js @@ -0,0 +1,20 @@ +import { countDistinctPowers } from '../Problem029' + +/** + * Tests for the countDistinctPowers function. + */ +describe('countDistinctPowers', () => { + it.each([ + { minA: 2, maxA: 5, minB: 2, maxB: 5, expected: 15 }, + { minA: 2, maxA: 100, minB: 2, maxB: 100, expected: 9183 }, + { minA: 2, maxA: 2, minB: 2, maxB: 2, expected: 1 }, + { minA: 3, maxA: 3, minB: 2, maxB: 5, expected: 4 }, + { minA: 10, maxA: 10, minB: 2, maxB: 5, expected: 4 } + ])( + 'should return $expected for ranges $minA to $maxA and $minB to $maxB', + ({ minA, maxA, minB, maxB, expected }) => { + const result = countDistinctPowers(minA, maxA, minB, maxB) + expect(result).toBe(expected) + } + ) +}) diff --git a/Project-Euler/test/Problem030.test.js b/Project-Euler/test/Problem030.test.js new file mode 100644 index 0000000000..bc0ac30e36 --- /dev/null +++ b/Project-Euler/test/Problem030.test.js @@ -0,0 +1,8 @@ +import { sumOfFifthPowers } from '../Problem030' // Adjust the path if necessary + +describe('sumOfFifthPowers', () => { + it('should return the sum of all numbers that can be written as the sum of fifth powers of their digits', () => { + const result = sumOfFifthPowers() + expect(result).toBe(443839) // Expected result based on the problem statement + }) +})