对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 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 就不幸福。
本题就要求你编写程序,列出给定区间内的所有特立独行的幸福数和它的独立性。
输入格式:输入在第一行给出闭区间的两个端点:1<A<B≤10000
输出格式:按递增顺序列出给定闭区间 [A,B] 内的所有特立独行的幸福数和它的独立性。每对数字占一行,数字间以 1 个空格分隔。
如果区间内没有幸福数,则在一行中输出 SAD。
输入样例1: 10 40
输出样例1: 19 8
23 6
28 3
31 4
32 3
输入样例2:110 120
输出样例2:SAD
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<stdbool.h> 5 6 int main(void) 7 { 8 int j; 9 int a,b; 10 int num; 11 int vis[10005]; //用来记录是否出现 12 int vis2[10005]; //判断是否循环 13 int ok[10005]; 14 int flag = 0; 15 16 scanf("%d %d",&a,&b); 17 18 memset(vis,0,sizeof(vis)); //清空vis数组 19 memset(ok,0,sizeof(ok)); 20 21 for(num=a; num<=b; num++) 22 { 23 int cnt = 0; 24 int temp = num; 25 26 if(vis[temp]) //出现过就不是幸福数 27 { 28 continue; 29 } 30 memset(vis2,0,sizeof(vis2));//清空数组a 31 while(1) //迭代 32 { 33 int sum = 0; 34 while(temp) //对一个数的每位上的数字求平方并且相加 35 { 36 sum = sum+(temp%10)*(temp%10); 37 temp = temp/10; 38 } 39 if(sum>=a && sum<=b) 40 { 41 vis[sum] = 1; //标记数字已经出现过 //其他数字如果的跌倒到它就break 42 } 43 if(vis2[sum]) 44 { 45 vis[num] = 1; 46 break; 47 } 48 temp = sum; //从得到的值再进行迭代 49 cnt++; //独立性加1 50 vis2[sum] = 1; //同样是标记 如果别的数通过迭代碰到了这个 同样跳出即不是幸福数 51 if(sum==1) 52 { 53 ok[num] = cnt; 54 for(j=2; j<=sqrt(num); j++) //flag= 1就不是素数了 55 { 56 if(num%j == 0) 57 flag = 1; 58 } 59 60 if(flag == 0)//如果是素数 61 ok[num] = ok[num]*2; 62 flag = 0; 63 break; 64 } 65 } 66 } 67 68 bool f = false; 69 int i; 70 for(i=a; i<=b; i++) 71 { 72 if(vis[i]==0 && ok[i]>0) 73 { 74 printf("%d %d\n",i,ok[i]); 75 f = true; 76 } 77 } 78 if(!f) 79 { 80 printf("SAD"); 81 } 82 return 0; 83 }