PAT(乙级)2020年秋季考试 7-2 数字之王 (20分)

7-2 数字之王 (20分)
 

给定两个正整数 N1​​<N2​​。把从 N1​​ 到 N2​​ 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。

例如 N1​​=1 和 0 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。

本题就请你对任意给定的 N1​​<N2​​ 求出对应的数字之王。

输入格式:

输入在第一行中给出两个正整数 0,其间以空格分隔。

输出格式:

首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入 1 10 就应该在两行中先后输出 6 和 8。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10 14
 

输出样例:

2
0 8


代码讲解:这题最最最最最最最重要的断句要好。。。这题的例子有点坑,很容易
让你走错道。。。。我刚开始就是。。这题的题意是假设18,那我们求的是1^3,和
8^3相乘就是512*1 然后把它每一位都相加 5+1+2最后他的结果就是18了。。。理解
完这个题意,这题很容解决。。。


 1 #include<stdio.h>
 2 #include<math.h>
 3 long long   f(int n)           //毕竟里面有个立方相乘,避免数据太大用了个保险
 4 {
 5     if(n==0)             
 6     return 0;
 7     long long  sum=0,fac=1;
 8     while(n!=0)
 9     {
10         fac*=(int)(pow(n%10,3));
11         n/=10; 
12     }
13     while(fac!=0)
14     {
15         sum+=fac%10;
16         fac/=10;
17     }
18     return sum;             
19 }
20 int main()
21 {
22     int n1,n2,i,flag=0,t=0,b[10]={0};
23     scanf("%d %d",&n1,&n2);
24     long long  a[1005],count=0,temp;
25     for(i=n1;i<=n2;i++)
26     {
27         if(i<10)
28         t++;                //记录个位数有几个
29         a[count++]=i;
30     }
31     while(t!=count)          //如果各位数满员了说明找到了
32     {
33         t=0;
34         for(i=0;i<count;i++)
35         {
36             temp=f(a[i]);
37             if(temp<10)
38             t++;
39             a[i]=temp; 
40         }
41      } 
42      for(i=0;i<count;i++)   //最后的把各个  个位数 hash统计一下次数
43       {
44           b[a[i]]++;
45       }
46       int max=-1;
47       for(i=0;i<10;i++)            //找出里面最大的
48       {
49           if(b[i]>max)
50           {
51               max=b[i];
52           }
53       }
54       printf("%d\n",max);
55       for(i=0;i<10;i++)         //输出
56       {
57           if(b[i]==max)
58           {
59               if(flag==0)
60               {
61                   printf("%d",i);
62                   flag=1;
63               }
64               else
65               {
66                   printf(" %d",i);
67               }
68           }
69       }
70      printf("\n");
71     return 0;
72 }

 

 
posted @ 2020-11-30 19:52  罪梦者  阅读(400)  评论(0)    收藏  举报