首页 > 其他 > 详细

(Problem 74)Digit factorial chains

时间:2014-02-18 16:00:04      阅读:246      评论:0      收藏:0      [点我收藏+]

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 bubuko.com,布布扣 363601 bubuko.com,布布扣 1454 bubuko.com,布布扣 169 871 bubuko.com,布布扣 45361 bubuko.com,布布扣 871 872 bubuko.com,布布扣 45362 bubuko.com,布布扣 872

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

69 bubuko.com,布布扣 363600 bubuko.com,布布扣 1454 bubuko.com,布布扣 169 bubuko.com,布布扣 363601 (bubuko.com,布布扣 1454) 78 bubuko.com,布布扣 45360 bubuko.com,布布扣 871 bubuko.com,布布扣 45361 (bubuko.com,布布扣 871) 540 bubuko.com,布布扣 145 (bubuko.com,布布扣 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 bubuko.com,布布扣 363601 bubuko.com,布布扣 1454 bubuko.com,布布扣 169 871 bubuko.com,布布扣 45361 bubuko.com,布布扣 871 872 bubuko.com,布布扣 45362 bubuko.com,布布扣 872

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

69 bubuko.com,布布扣 363600 bubuko.com,布布扣 1454 bubuko.com,布布扣 169 bubuko.com,布布扣 363601 (bubuko.com,布布扣 1454) 78 bubuko.com,布布扣 45360 bubuko.com,布布扣 871 bubuko.com,布布扣 45361 (bubuko.com,布布扣 871) 540 bubuko.com,布布扣 145 (bubuko.com,布布扣 145)

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

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

bubuko.com,布布扣
//(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\n", count);
}
 
int main()
{
    init();
    solve();
    return 0;
}
bubuko.com,布布扣
Answer:
402

(Problem 74)Digit factorial chains

原文:http://www.cnblogs.com/acutus/p/3554019.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!