Digit factorials: Find the Sum of All the Curious Numbers

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

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

推荐阅读:
保健养生:果蔬是“抗癌”食品首选  国家食药总局曝光10种假冒保健食品  饮食养生:春韭对人体有何保健作用  保健食品批准文号假冒现象透析  哪些食物未烹饪熟时易中毒?  豆角中毒的预防方法和治疗措施  炒豆角一定要煮熟才是安全的  姜蒜发芽了不会产生有毒物质  营养保健:七种干果养胃补肾延寿  整治食品安全要用重典才能阻击问题食品 
评论列表
添加评论