【2019秋PAT乙级真题】7-4 天长地久 (20 分)

7-4 天长地久 (20 )

天长地久数是指一个 K 位正整数 A,其满足条件为:A 的各位数字之和为 mA+1 的各位数字之和为 n,且 m  n 的最大公约数是一个大于 2 的素数。本题就请你找出这些天长地久数。

输入格式:

输入在第一行给出正整数 N≤5),随后 N 行,每行给出一对 K3<K<10)和 m1<m<90),其含义如题面所述。

输出格式:

对每一对输入的 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

命题人姥姥说了。。暴力就好了

自己浅薄的分析一下,如果数字尾数不是9,是其他的 ,那么+1之后

只能从类似的 123变成124,和从6变成7(举的例子)

也就是gcd(n+1,n)只能是0;

但是如果尾号是9

+1 之后变成0,前面进位

就是19 变20 和从 10变成2,也就是-9+1,尾数有几个连续的9就是减去几个9,然后进位再加一

只有尾数是9才能满足和的公约数不是1.

然后看几个9呢 。

一个九就是gcd(n+8,n)=8;不满足

俩九就是 gcd(n+17,n)=17;满足大于2了

后面可以再考虑进去多个九,已经不重要了,范围从3到9位去掉后面固定99,就剩下 1-7位了,前面直接遍历应该就稳稳的了

 

猜测的代码(现在还不能再pta上做真题,所以不知道对不对)

在原来超时的基础上,修改一下循环头

for(long long int l=p/10+99;l
#include
#include
using namespace std;
int gcd(int a,int b){
	if(b>a){
		int t=a;
		a=b;
		b=t;
	}
	if(b!=0){
		gcd(b,a%b);	
	}else{
		return a;
	}
}
int issu(int a){
	int b=2;
	for(b;b<=sqrt(a);b++){
		if(a%b==0){
			return 0;
		}
	}return 1;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cout<<"Case "<>k>>m;
		if(m/k>9||k>=10||k<=3){
			cout<<"No Solution"<0){
				n1+=s1%10;
				s1/=10;
			}
			//cout<0){
				n2+=s2%10;
				s2/=10;
			}
			int pp=gcd(n1,n2);
			if(pp>2&&issu(pp)){
				flag=1;
				cout<

 

 

 

10分15毫秒版

#include
#include
#include
using namespace std;
struct daan{
	string A;
	int n;
	
};
bool cmp(daan d1,daan d2){
	//return (d1.A!=d2.A) ?d1.Aa){
		int t=a;
		a=b;
		b=t;
	}
	if(b!=0){
		gcd(b,a%b);	
	}else{
		return a;
	}
}
int issu(int a){
	int b;
	for(b=2;b<=sqrt(a);b++){
		if(a%b==0){
			return 0;
		}
	}return 1;
}
int main(){
	int n;
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cout<<"Case "<>k>>m;
		if(m/k>9||k>=10||k<=3){
			cout<<"No Solution"<2&&issu(p)&&(m+1-n1)%9==0){
				int jiu=(m+1-n1)/9;
				int sheng=m-jiu*9;
				string s;
				for(int e=0;e0){
						he+=ll%10;
						ll=ll/10;
					}ll=l;
					if(he==sheng){
						string s3=s;
						//cout<0){
							char c=ll%10+'0';
							s3=c+s3;
							ll=ll/10;
							//cout<

超时12分

 

#include
#include
using namespace std;
int gcd(int a,int b){
	if(b>a){
		int t=a;
		a=b;
		b=t;
	}
	if(b!=0){
		gcd(b,a%b);	
	}else{
		return a;
	}
}
int issu(int a){
	int b=2;
	for(b;b<=sqrt(a);b++){
		if(a%b==0){
			return 0;
		}
	}return 1;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cout<<"Case "<>k>>m;
		if(m/k>9||k>=10||k<=3){
			cout<<"No Solution"<0){
				n1+=s1%10;
				s1/=10;
			}
			//cout<0){
				n2+=s2%10;
				s2/=10;
			}
			int pp=gcd(n1,n2);
			if(pp>2&&issu(pp)){
				flag=1;
				cout<

 

你可能感兴趣的:(C++,pat,#,PAT乙级练习题)