特立独行的幸福

对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 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 }

 

 
posted @ 2020-03-14 12:13  Xxaj5  阅读(676)  评论(0编辑  收藏  举报