问题 C: Digit Chains
时间限制: 10 Sec 内存限制: 64 MB提交: 531 解决: 62
[ 提交][ 状态][ 讨论版]
题目描述
很高兴你能参加一年一度的NEUQ ACM程序设计竞赛。
只要A了这道题就有机会拿奖哦!快来拼手速A了我!
将一个数字n的每一位平方后相加可以得到一个新的数字,如此重复便可得到数字n对应的数字链。
例如:
27-53-34-25-29-85-89
15-26-40-16-37-58-89
你会发现如果在运算过程中得到数字1或89那么数字链可以无限循环下去。现在给定一个范围,你需要算出有多少数字最终可以得到89.
注:数字89本身不算入结果
输入
范围n
n≤10000000
输出
可以得到89的数字个数
样例输入
5
样例输出
4
这题开始20分钟就写出来了,可惜忘记了89本身导致一直WA。
题解:预处理1到10000000的所有答案,然后输出即可。
预处理方法:题目已经提示。1或者89会无限循环,则每个数最终必然会得到1或者89,i符合,则a[i]=a[i-1]+1;i不符合,a[i]=a[i-1];
89处理方法:一,可以循环到89时continue;
二,当n大于等于89时输出a[n]-1;
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
using namespace std;
int a[10000005];
int main(){
int n;
for(int i=1;i<=10000000;i++){
int n=i,t;
while(n!=89&&n!=1){
t=0;
while(n){
t+=(n%10)*(n%10);
n/=10;
}
n=t;
}
if(n==89)
a[i]=a[i-1]+1;
else
a[i]=a[i-1];
}
while(cin>>n)
if(n>=89)
cout<<a[n]-1<<endl;
else
cout<<a[n]<<endl;
return 0;
}