Digit factorials: Find the Sum of All the Curious Numbers

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

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) —

推荐阅读:
描写五莲山风景的作文  诗词名句鉴赏:少壮不努力,老大徒伤悲。  诗词名句鉴赏:秋风萧萧愁杀人  诗词名句鉴赏:树欲静而风不止  诗词名句鉴赏:忧艰常早至,欢会常苦晚。  春王正月原文及翻译  诗词名句鉴赏:风萧萧兮易水寒,壮士一去兮不复还!  申胥谏许越成原文及翻译  诸稽郢行成于吴原文及翻译  诗词名句鉴赏:秋风起兮白云飞,草木黄落兮雁南归。 
评论列表
添加评论