zoukankan      html  css  js  c++  java
  • 特立独行的幸福

    对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 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 }
     
  • 相关阅读:
    Oracle 分析函数
    Oracle 增加修改删除字段
    Oracle 重置序列
    End2EndIT
    Hyperledger Fabric SDK use case 1
    云计算中8项核心技术
    Cloud
    JVM Guide
    微信公众平台PHP开发
    在Linux系统环境下修改MySQL的root密码
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491459.html
Copyright © 2011-2022 走看看