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\n",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\n",sum); } int main(void) { solve(); return 0; }
Answer:
|
8581146 |
Completed on Sun, 24 Nov 2013, 10:26