(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: [email protected]) 

// 博客地址: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\n", count);

}

 

int main()

{

    init();

    solve();

    return 0;

}
Answer:
402

你可能感兴趣的:(chain)