(Problem 74)Digit factorial chains

The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145:

1! + 4! + 5! = 1 + 24 + 120 = 145

Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it turns out that there are only three such loops that exist:

169 → 363601 → 1454 → 169 871 → 45361 → 871 872 → 45362 → 872

It is not difficult to prove that EVERY starting number will eventually get stuck in a loop. For example,

69 → 363600 → 1454 → 169 → 363601 (→ 1454) 78 → 45360 → 871 → 45361 (→ 871) 540 → 145 (→ 145)

Starting with 69 produces a chain of five non-repeating terms, but the longest non-repeating chain with a starting number below one million is sixty terms.

How many chains, with a starting number below one million, contain exactly sixty non-repeating terms?

题目大意:

数字145有一个著名的性质:其所有位上数字的阶乘和等于它本身。

1! + 4! + 5! = 1 + 24 + 120 = 145

169不像145那么有名,但是169可以产生最长的能够连接回它自己的数字链。事实证明一共有三条这样的链:

169 → 363601 → 1454 → 169 871 → 45361 → 871 872 → 45362 → 872

不难证明每一个数字最终都将陷入一个循环。例如:

69 → 363600 → 1454 → 169 → 363601 (→ 1454) 78 → 45360 → 871 → 45361 (→ 871) 540 → 145 (→ 145)

从69开始可以产生一条有5个不重复元素的链,但是以一百万以下的数开始,能够产生的最长的不重复链包含60个项。

一共有多少条以一百万以下的数开始的链包含60个不重复项?

//(Problem 74)Digit factorial chains
// Completed on Tue, 18 Feb 2014, 04:21
// Language: C11
//
// 版权所有(C)acutus   (mail: acutus@126.com) 
// 博客地址:http://www.cnblogs.com/acutus/

#include<stdio.h>
#include<math.h>
#include<stdbool.h>
 
#define N 1000000
long long fac[10];  //保存1~ 9阶乘的数组
 
long long factorial(int n)  //计算阶乘函数
{
    if(n == 1 || n == 0) return 1;
    else return n * factorial(n - 1);
}
 
void init()  //初始化数组
{
    int i;
    for(i = 0; i <= 9; i++) {
        fac[i] = factorial(i);
     }
}

long long sum(long long n)   //计算整数n各位的阶乘的和
{
    int ans = 0;
    while(n) {
        ans += fac[n % 10];
        n /= 10;
     }
    return ans;
}

bool fun(int n)
{
    int i, count, t;
    bool flag = false;
    count = 0;
    while(1) {
        switch(n) {
            case 1: count += 1; flag = true; break;
            case 2: count += 1; flag = true; break;
            case 169: count += 3; flag = true; break;
            case 1454: count += 3; flag = true; break;
            case 871: count += 2; flag = true; break;
            case 872: count += 2; flag = true; break;
            case 145: count += 1; flag = true; break;
            default: t = sum(n);
                     if( n == t) {
                         flag = true;
                         break; 
                     } else{
                        n = t;
                        count++; break;
                     }
        }
        if(flag) break;
    }
    if(count == 60) return true;
    else return false;
}

void solve()
{
    int i, count;
    count = 0;
    for(i = 2; i <= N; i++) {
        if(fun(i)) count++;
    }
    printf("%d
", count);
}
 
int main()
{
    init();
    solve();
    return 0;
}
Answer:
402
原文地址:https://www.cnblogs.com/acutus/p/3554019.html