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 }
 
                    
                
                
            
        
浙公网安备 33010602011771号