zoukankan      html  css  js  c++  java
  • (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) LeetCode 44. Wildcard Matching —— 通配符匹配
    (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
    (Java) LeetCode 515. Find Largest Value in Each Tree Row —— 在每个树行中找最大值
    (Java) LeetCode 433. Minimum Genetic Mutation —— 最小基因变化
    (Java) LeetCode 413. Arithmetic Slices —— 等差数列划分
    (Java) LeetCode 289. Game of Life —— 生命游戏
    (Java) LeetCode 337. House Robber III —— 打家劫舍 III
    (Java) LeetCode 213. House Robber II —— 打家劫舍 II
    (Java) LeetCode 198. House Robber —— 打家劫舍
    (Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/acutus/p/3554019.html
Copyright © 2011-2022 走看看