Digit factorials: Find the Sum of All the Curious Numbers

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

145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145.
Find the sum of all numbers which are equal to the sum of the factorial of their digits.
Note: as 1! = 1 and 2! = 2 are not sums they are not included.

Pre-computing the Digit factorials

The factorials we all need to know are from 0! to 9!. Therefore, we can pre-compute the digital factorials and store them in a dictionary (or hash map).

1
2
3
4
5
6
7
let factorials = {};
let s = 1;
for (let i = 1; i <= 9; ++ i) {
    s *= i;
    factorials[i] = s;
}
factorials[0] = 1;
let factorials = {};
let s = 1;
for (let i = 1; i <= 9; ++ i) {
    s *= i;
    factorials[i] = s;
}
factorials[0] = 1;

A single loop from 1 to 9 is sufficient as we are iteratively multiple the next number.

Uppper bound of the Curious Numbers

We don’t need to and we can’t search infinite numbers. One upperbound we can use is 9999999 as 7*9! is less than 9999999.

We then bruteforce all the numbers and sum those curious numbers. The curious number can be determined by the following procedure: converted to string, and split into char array, then sum up the digital factorials, finally comparing the sum with the number.

1
2
3
4
5
6
7
8
9
10
let sum = 0;
for (let i = 3; i <= 9999999; ++ i) {
    let x = String(i).split('').reduce((a, b) => {
        return a + factorials[b];
    }, 0);
    if (x === i) {
        sum += i;
    }
}
console.log(sum);
let sum = 0;
for (let i = 3; i <= 9999999; ++ i) {
    let x = String(i).split('').reduce((a, b) => {
        return a + factorials[b];
    }, 0);
    if (x === i) {
        sum += i;
    }
}
console.log(sum);

The answer is 40730.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
周郑交质原文及翻译  郑伯克段于鄢原文及翻译  曲谱列表  奥数题:A+B=2300,小红计算时将A个位上的0漏掉了  数学题:甲乙二人同时从A地出发匀速走向B地  数学题:一种农药用药液和水按照1:1500配制而成  数学题:回收1千克废纸,可生产0.8千克再生纸  数学题:丢番图的墓志铭  数学题:如果一个圆柱体的底面直径与高相等  数学题:卧车和客车所行路程比15:16 
评论列表
添加评论