• (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
  • 相关阅读:
    转载__Java内部类
    Fragment之介绍(转)
    转载__Android-屏幕适配需要注意的地方
    转载__广播机制
    Activity的启动模式--总结
    图片_ _Android--加载大分辨率图片到内存
    转载—— android 瀑布流的实现详解,附源码
    转载_安卓性能优化
    C# Byte[] 数组操作
    C# 测算代码运行时间 Stopwatch
  • 原文地址:https://www.cnblogs.com/acutus/p/3554019.html
Copyright © 2020-2023  润新知