zoukankan      html  css  js  c++  java
  • (Problem 92)Square digit chains

    A number chain is created by continuously adding the square of the digits in a number to form a new number until it has been seen before.

    For example,

    44 → 32 → 13 → 10 → 1 → 1 85 → 89 → 145 → 42 → 20 → 4 → 16 → 37 → 58 → 89

    Therefore any chain that arrives at 1 or 89 will become stuck in an endless loop. What is most amazing is that EVERY starting number will eventually arrive at 1 or 89.

    How many starting numbers below ten million will arrive at 89?

    题目大意:

    通过将一个数各位的平方不断相加,直到遇到已经出现过的数字,可以形成一个数字链。

    例如:

    44 → 32 → 13 → 10 → 1 → 1 85 → 89 → 145 → 42 → 20 → 4 → 16 → 37 → 58 → 89

    因此任何到达1或89的数字链都会陷入无限循环。令人惊奇的是,以任何数字开始,最终都会到达1或89。

    以一千万以下的数字n开始,有多少个n会到达89?

    算法一:常规方法,从2~10000000逐个判断,同时统计结果

    #include<stdio.h>   
    
    #define N 10000000
    
    int fun(int n)
    {
        int t, sum;
        sum = 0; 
        while(n) {
            t = n % 10;
            sum += t * t;
            n /= 10;
        }
        return sum;
    }
    
    void solve(void)
    {
        int i, sum, t;
        sum = 0;
        for(i = 2; i < N; i++) {
            t = fun(i);
            while(1) {
                if(t == 89) {
                    sum++;
                    break;
                } else if(t == 1) {
                    break;
                } else {
                    t = fun(t);
                }
            }
        }
        printf("%d
    ",sum);
    }
    
    int main(void)
    {
        solve();
        return 0;
    }

    算法二(优化):使用一个bool型数组,保存每次结果,由于最大的中间数为9999999产生的:9^2*7 = 567,所以bool型数组的大小开到600足够

    #include <stdio.h>
    #include <stdbool.h>      
    
    #define N 10000000
    
    bool a[600] = {false};
    
    int fun(int n)
    {
        int t, sum;
        sum = 0; 
        while(n) {
            t = n % 10;
            sum += t * t;
            n /= 10;
        }
        return sum;
    }
    
    void solve(void)
    {
        int i, sum, t, temp;
        sum = 0;
        for(i = 2; i < N; i++) {
            t = fun(i);
            temp = t;
            if(a[temp]) {
                sum++;
            } else {
                while(1) {
                    t = fun(t);
                    if(a[t] || t == 89) {
                        a[temp] = true;
                        sum++;
                        break;
                    } else if(t == 1) {
                        break;
                    } else {
                    }
                }
            }
        }
        printf("%d
    ",sum);
    }
    
    int main(void)
    {
        solve();
        return 0;
    }
    Answer:
    8581146
    作者:acutus
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    UML总结4---UML九种图关系说明
    TCP/IP学习笔记__mbuf
    操作系统内存管理之 内部碎片vs外部碎片
    校园招聘面试-操作系统知识总结 分看点三
    操作系统常见面试题总结 分看点二
    操作系统之面试常考 分看点一
    操作系统基础知识总结(二)
    操作系统基础知识总结(一)
    Java HashMap的扩容
    linux查看端口被占用情况
  • 原文地址:https://www.cnblogs.com/acutus/p/3509363.html
Copyright © 2011-2022 走看看