题目
对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数的个数。如果这个数还是个素数,则其独立性加倍。例如 19 在区间[1, 100] 内就是一个特立独行的幸福数,其独立性为 2×4=8。
另一方面,如果一个大于1的数字经过数次迭代后进入了死循环,那这个数就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可见 89 到 58 形成了死循环,所以 29 就不幸福。
本题就要求你编写程序,列出给定区间内的所有特立独行的幸福数和它的独立性。
测试样例
10 40
19 8
23 6
28 3
31 4
32 3
110 120
SAD
解题思路
在给定的范围中,可以先遍历一遍,用数组标记出依附于其他数字的数和不幸福的数(即陷入死循环的数),然后在遍历剩下的数。
AC代码
#include<bits/stdc++.h>
using namespace std;
bool judge(int x){//判读是否为素数。
int t=sqrt(x);
for(int i=2;i<=t;i++)
if(x%i==0)return false;
return true;
}
int book[10010];//用于第一遍遍历数,标记特立独行的数为0
int main(){
int n,m;
cin>>n>>m;
for(int i=n;i<=m;i++){
int t=i;
if(book[i]==0){
int book1[10010]={0};//用于判断该数是否不幸福(死循环)
while(1){
int sum=0;
while(i){
sum+=pow((i%10),2);
i/=10;
}
if(sum==1)break;
i=sum;
if(book1[i]){
book[i]=1;
book[t]=1;
break;
}
book[sum]=1;
book1[sum]=1;
}
}
i=t;
}
int c=0;//如果始终为零,则说明范围内的数都不幸福。
for(int i=n;i<=m;i++){
if(book[i]==0){
int t=i,cn=0;
if(judge(i))c=2;
else c=1;
while(t!=1){
cn++;
int sum=0;
while(t){
sum+=pow((t%10),2);
t/=10;
}
t=sum;
}
cout<<i<<" "<<cn*c<<endl;
}
}
if(c==0)cout<<"SAD";
return 0;}