| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,21 +1,39 @@ | |||
| 1 | - /* | ||
| 2 | - Factorial digit sum | ||
| 1 | + /** | ||
| 2 | + * Problem 20 - Factorial digit sum | ||
| 3 | + * | ||
| 4 | + * @see {@link https://projecteuler.net/problem=20} | ||
| 5 | + * | ||
| 6 | + * n! means n × (n − 1) × ... × 3 × 2 × 1 | ||
| 7 | + * | ||
| 8 | + * For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, | ||
| 9 | + * and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 | ||
| 10 | + * | ||
| 11 | + * Find the sum of the digits in the number 100! | ||
| 12 | + */ | ||
| 3 | 13 | ||
| 4 | - n! means n × (n − 1) × ... × 3 × 2 × 1 | ||
| 14 | + const factorialDigitSum = function (n = 100) { | ||
| 5 | 15 | ||
| 6 | - For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, | ||
| 7 | - and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. | ||
| 16 | + // Consider each digit*10^exp separately, right-to-left ([units, tens, ...]). | ||
| 17 | + let digits = [1]; | ||
| 8 | 18 | ||
| 9 | - Find the sum of the digits in the number 100! | ||
| 10 | - */ | ||
| 19 | + for (let x=2; x<=n; x++) { | ||
| 20 | + let carry = 0; | ||
| 21 | + for (let exp=0; exp<digits.length; exp++) { | ||
| 22 | + const prod = digits[exp]*x + carry; | ||
| 23 | + carry = Math.floor(prod/10); | ||
| 24 | + digits[exp] = prod % 10; | ||
| 25 | + } | ||
| 26 | + while (carry > 0) { | ||
| 27 | + digits.push(carry%10); | ||
| 28 | + carry = Math.floor(carry/10); | ||
| 29 | + } | ||
| 30 | + } | ||
| 11 | 31 | ||
| 12 | - const findFactorialDigitSum = (num) => { | ||
| 13 | - let result = 0 | ||
| 14 | - const stringifiedNumber = factorize(num).toLocaleString('fullwide', { useGrouping: false }) | ||
| 15 | - stringifiedNumber.split('').map(num => { result += Number(num) }) | ||
| 16 | - return result | ||
| 32 | + // (digits are reversed but we only want the sum so it doesn't matter) | ||
| 33 | + | ||
| 34 | + return digits.reduce((prev, current) => prev + current, 0) | ||
| 17 | 35 | } | |
| 18 | 36 | ||
| 19 | - const factorize = (num) => num === 0 ? 1 : num * factorize(num - 1) | ||
| 37 | + console.log('Factorial digit sum of 100! :', factorialDigitSum()) | ||
| 20 | 38 | ||
| 21 | - console.log(findFactorialDigitSum(100)) | ||
| 39 | + module.exports = factorialDigitSum | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments