diff --git a/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-88-product-sum-numbers.md b/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-88-product-sum-numbers.md index 96efafdf5d..3134d9cacf 100644 --- a/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-88-product-sum-numbers.md +++ b/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-88-product-sum-numbers.md @@ -8,7 +8,7 @@ dashedName: problem-88-product-sum-numbers # --description-- -A natural number, N, that can be written as the sum and product of a given set of at least two natural numbers, {`a`1, `a`2, ... , `a`k} is called a product-sum number: N = `a`1 + `a`2 + ... + `a`k = `a`1 × `a`2 × ... × `a`k. +A natural number, `N`, that can be written as the sum and product of a given set of at least two natural numbers, $\\{a_1, a_2, \ldots , a_k\\}$ is called a product-sum number: $N = a_1 + a_2 + \cdots + a_k = a_1 × a_2 × \cdots × a_k$. For example, 6 = 1 + 2 + 3 = 1 × 2 × 3. @@ -20,26 +20,50 @@ For a given set of size, `k`, we shall call the smallest N with this property a k=4: 8 = 1 × 1 × 2 × 4 = 1 + 1 + 2 + 4
k=5: 8 = 1 × 1 × 2 × 2 × 2 = 1 + 1 + 2 + 2 + 2
k=6: 12 = 1 × 1 × 1 × 1 × 2 × 6 = 1 + 1 + 1 + 1 + 2 + 6 - +
-Hence for 2≤`k`≤6, the sum of all the minimal product-sum numbers is 4+6+8+12 = 30; note that 8 is only counted once in the sum. +Hence for 2 ≤ `k` ≤ 6, the sum of all the minimal product-sum numbers is 4 + 6 + 8 + 12 = 30; note that `8` is only counted once in the sum. -In fact, as the complete set of minimal product-sum numbers for 2≤`k`≤12 is {4, 6, 8, 12, 15, 16}, the sum is 61. +In fact, as the complete set of minimal product-sum numbers for 2 ≤ `k` ≤ 12 is $\\{4, 6, 8, 12, 15, 16\\}$, the sum is `61`. -What is the sum of all the minimal product-sum numbers for 2≤`k`≤12000? +What is the sum of all the minimal product-sum numbers for 2 ≤ `k` ≤ `limit`? # --hints-- -`productSumNumbers()` should return a number. +`productSumNumbers(6)` should return a number. ```js -assert(typeof productSumNumbers() === 'number'); +assert(typeof productSumNumbers(6) === 'number'); ``` -`productSumNumbers()` should return 7587457. +`productSumNumbers(6)` should return `30`. ```js -assert.strictEqual(productSumNumbers(), 7587457); +assert.strictEqual(productSumNumbers(6), 30); +``` + +`productSumNumbers(12)` should return `61`. + +```js +assert.strictEqual(productSumNumbers(12), 61); +``` + +`productSumNumbers(300)` should return `12686`. + +```js +assert.strictEqual(productSumNumbers(300), 12686); +``` + +`productSumNumbers(6000)` should return `2125990`. + +```js +assert.strictEqual(productSumNumbers(6000), 2125990); +``` + +`productSumNumbers(12000)` should return `7587457`. + +```js +assert.strictEqual(productSumNumbers(12000), 7587457); ``` # --seed-- @@ -47,16 +71,40 @@ assert.strictEqual(productSumNumbers(), 7587457); ## --seed-contents-- ```js -function productSumNumbers() { +function productSumNumbers(limit) { return true; } -productSumNumbers(); +productSumNumbers(6); ``` # --solutions-- ```js -// solution required +function productSumNumbers(limit) { + function getProductSums(curProduct, curSum, factorsCount, start) { + const k = curProduct - curSum + factorsCount; + if (k <= limit) { + if (curProduct < minimalProductSums[k]) { + minimalProductSums[k] = curProduct; + } + for (let i = start; i < Math.floor((limit / curProduct) * 2) + 1; i++) { + getProductSums(curProduct * i, curSum + i, factorsCount + 1, i); + } + } + } + + const minimalProductSums = new Array(limit + 1).fill(2 * limit); + getProductSums(1, 1, 1, 2); + + const uniqueProductSums = [...new Set(minimalProductSums.slice(2))]; + + let sum = 0; + for (let i = 0; i < uniqueProductSums.length; i++) { + sum += uniqueProductSums[i]; + } + + return sum; +} ```