Compute Factorial Digit Sum: Find the sum of the digits in the n

  • 时间:2020-09-10 12:45:51
  • 分类:网络文摘
  • 阅读:131 次

n! means n × (n − 1) × … × 3 × 2 × 1

For example, 10! = 10 × 9 × … × 3 × 2 × 1 = 3628800,
and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

Find the sum of the digits in the number 100!

Algorithm to Compute Factorial Digit Sum

Since the factorial could be very large, we need to use an array (or hashmap) to store the digits of the answer. However, in some programming language, large values can be stored e.g. BigInteger in Java or Python.

Similar to Digit factorials: Find the Sum of All the Curious Numbers, we will compute the factorial and store the value in a dictionary.

Then the digits (values of the dictionary) are iterated and sum is obtained via the Array.reduce() function.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
let arr = {
    0: 1
};
 
for (let i = 2; i <= 100; ++i) {
    // multiply by value i
    Object.keys(arr).map(x => {
        arr[x] *= i;
    });
    let c = Math.floor(arr[0] / 10);
    let j = 1;
    arr[0] %= 10;
    // higest position of the value
    const maxKey = Math.max(...Object.keys(arr));
    while ((c > 0) || (j <= maxKey)) {
        if (typeof arr[j] === 'undefined') {
            arr[j] = c;
        } else {
            arr[j] = arr[j] + c;
        }
        // carry over
        c = Math.floor(arr[j] / 10);
        arr[j] %= 10;
        j ++;
    }
}
 
// sum up all the digits of the answer
console.log(Object.values(arr).reduce((a, b) => a + b));
let arr = {
    0: 1
};

for (let i = 2; i <= 100; ++i) {
    // multiply by value i
    Object.keys(arr).map(x => {
        arr[x] *= i;
    });
    let c = Math.floor(arr[0] / 10);
    let j = 1;
    arr[0] %= 10;
    // higest position of the value
    const maxKey = Math.max(...Object.keys(arr));
    while ((c > 0) || (j <= maxKey)) {
        if (typeof arr[j] === 'undefined') {
            arr[j] = c;
        } else {
            arr[j] = arr[j] + c;
        }
        // carry over
        c = Math.floor(arr[j] / 10);
        arr[j] %= 10;
        j ++;
    }
}

// sum up all the digits of the answer
console.log(Object.values(arr).reduce((a, b) => a + b));

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
数学题:一个长方体长,宽,高都是两位数,并且它们的和是偶数  数学题:若115,200,268被大于1的自然数除  数学题:一只蚂蚁从墙根竖直向上爬到墙头用了4分钟  一位农妇上午挎了一个空篮子笑眯眯地回家  奥数题:秋游时,小红小玲小芳三个好朋友在一个小组一起活动  平年和闰年自测题  数学题:李爷爷家住在半山腰  数学题:无线电元件厂验收一批零件  数学题:调查发现,该学校七年级参加魔方比赛的学生中  数学题:甲乙两辆客车同时从东站开往西站 
评论列表
添加评论