PAT(乙级)2019年秋季考试 7-4 天长地久 (20分)
7-4 天长地久 (20分)
“天长地久数”是指一个 K 位正整数 A,其满足条件为:A 的各位数字之和为 m,A+1 的各位数字之和为 n,且 m 与 n 的最大公约数是一个大于 2 的素数。本题就请你找出这些天长地久数。
输入格式:
输入在第一行给出正整数 N(≤),随后 N 行,每行给出一对 K(3)和 m(1),其含义如题面所述。
输出格式:
对每一对输入的 K 和 m,首先在一行中输出 Case X,其中 X 是输出的编号(从 1 开始);然后一行输出对应的 n 和 A,数字间以空格分隔。如果解不唯一,则每组解占一行,按 n 的递增序输出;若仍不唯一,则按 A 的递增序输出。若解不存在,则在一行中输出 No Solution。
输入样例:
2
6 45
7 80
输出样例:
Case 1 10 189999 10 279999 10 369999 10 459999 10 549999 10 639999 10 729999 10 819999 10 909999 Case 2 No Solution
代码讲解:此题很有意思,要慎重小心,首先如果你全部暴力求解的话
会超时的。。。但是他的时限给你很高,很容易产生一种错觉,暴力
没事。。。还有一个陷阱,他总说最后结果怎么排序之类的,很容易
让你误导,结果是不是要排序啊,结果排着排着超时了。。。
此题的解法应该是找规律和hash处理。。。
首先他要求比他大1的数的各个位数和和自己的各个位数和之间,
求最大公约数,这个数还必须是大于2的质数,末尾是0~8都不可能是
为什么因为你相加这俩个数必然互质,没可能。。。那末尾是9呢。
如果只有最后一位是9,那么加完之后m=n+8,如果m和n存在最大公约
数k,m能被k整除,n也能被k整除,那8也必然对k,整除啊。。。
那k只能是1,2,4,8对不对,那几个都不满足啊。。。看来只能进一位
的不行,那俩位的呢99,貌似可以 因为m=n+17,跟上面一个道理,
最大公约数有可能是17,完美满足条件,当然也有可能是1,到时候排除
掉就可以了,在往上找也是一样的。。。所以我们以,99为末尾开始搜索
具体写法上代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #include<string.h> 5 int gcd(int n,int m) //求最大公约数 6 { 7 if(m==0)return n; 8 else return gcd(m,n%m); 9 } 10 int digit(int n) //求各个位数之和 11 { 12 int count=0; 13 while(n!=0) 14 { 15 count+=n%10; 16 n=n/10; 17 } 18 return count; 19 } 20 int prime(int n) //判断是否是素数 21 { 22 if(n<2) 23 return 0; 24 int i; 25 for(i=2;i*i<=n;i++) 26 { 27 if(n%i==0) 28 return 0; 29 } 30 return 1; 31 } 32 int a[100][3000]={0};//hash<n,A+1>,第0位表示个数 33 int main() 34 { 35 int i,j,n,k,m,count,temp,p; 36 scanf("%d",&n); 37 for(i=1;i<=n;i++) 38 { 39 count=0; 40 memset(a,0,sizeof(a)); 41 scanf("%d %d",&k,&m); 42 for(j=pow(10,k-1)+99;j<pow(10,k);j+=100) 43 { 44 if(digit(j)==m) 45 { 46 temp=digit(j+1); 47 p=gcd(temp,m); 48 if(p!=2&&prime(p)) 49 { 50 count++; 51 a[temp][++a[temp][0]]=j; 52 } 53 } 54 } 55 printf("Case %d\n",i); 56 if(count==0) 57 { 58 printf("No Solution\n"); 59 } 60 else 61 { 62 for(j=0;j<100;j++) 63 { 64 for(k=1;k<=a[j][0];k++) 65 printf("%d %d\n",j,a[j][k]); 66 } 67 } 68 } 69 70 return 0; 71 }

                    
                
                
            
        
浙公网安备 33010602011771号