(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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/acutus/p/3509363.html