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 }

 

 

 

 

 

 
posted @ 2020-12-02 22:01  罪梦者  阅读(256)  评论(0)    收藏  举报