diff --git a/DIRECTORY.md b/DIRECTORY.md index e1bbd77000..c86cccec18 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -239,6 +239,7 @@ * [Problem017](Project-Euler/Problem017.js) * [Problem018](Project-Euler/Problem018.js) * [Problem020](Project-Euler/Problem020.js) + * [Problem021](Project-Euler/Problem021.js) * [Problem023](Project-Euler/Problem023.js) * [Problem025](Project-Euler/Problem025.js) * [Problem028](Project-Euler/Problem028.js) diff --git a/Project-Euler/Problem021.js b/Project-Euler/Problem021.js new file mode 100644 index 0000000000..c97bacd3b0 --- /dev/null +++ b/Project-Euler/Problem021.js @@ -0,0 +1,35 @@ +/** + * Amicable numbers + * + * P.S.(Project Euler - 021): + * Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). + * If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and each of a and b are called amicable numbers. + * + * For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; + * therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220. + * + * Evaluate the sum of all the amicable numbers under 10000. + * + * @param {Number} maxNum + * @returns {Number} Sum of all amicable numbers under maxNum + */ +export const sumAmicableNums = (maxNum) => { + const amicNums = [] + + for (let i = 1; i < maxNum; i++) { + const left = d(i) + const right = d(left) + if (i === right && i !== left && amicNums.indexOf(i) === -1) { + amicNums.push(i, left) + } + } + return amicNums.reduce((a, b) => a + b, 0) +} + +const d = (num) => { + const output = [] + for (let i = 1; i < num; i++) { + if (num % i === 0) { output.push(i) } + } + return output.reduce((a, b) => a + b, 0) +} diff --git a/Project-Euler/test/Problem021.test.js b/Project-Euler/test/Problem021.test.js new file mode 100644 index 0000000000..f907c1553f --- /dev/null +++ b/Project-Euler/test/Problem021.test.js @@ -0,0 +1,8 @@ +import { sumAmicableNums } from '../Problem021.js' + +describe('Amicable numbers', () => { + // Project Euler Condition Check + test('if the limit is 10000', () => { + expect(sumAmicableNums(10000)).toBe(31626) + }) +})