其他分享
首页 > 其他分享> > 记2021春季PAT乙级考试题解

记2021春季PAT乙级考试题解

作者:互联网

记2021春季PAT乙级考试题解

前言

过了快一月了总结一波,前面的题写的还挺顺畅,第四题前前后后淦一个多钟直接,第五题本来觉得挺难的,写着写着就有思路了,40多分钟最后拿了24分,总分79[哭泣](第四题一分没混到,心态崩了[苦涩]),记录一下第四题的方法,还没测试过,回头搞个考试劵再测测,更详细的题解可以看这位老哥的(https://blog.csdn.net/szu_chuqi/article/details/114761965),这里仅讨论一下第四题。

7-4 素数等差数列 (20 分)

题目:陶哲轩(Terence Tao)和本·格林(Ben Green)证明了:对于任意大的 n,均存在 n项全由素数组成的等差数列。例如 { 7,37,67,97,127,157 } 是 n=6 的解。本题就请你对给定的 n在指定范围内找出一组最大的解。

输入格式: 输入在一行中给出两个正整数:n(≤ 10)为等差素数数列的项数; MAXP (2 ≤ MAXP <= 1e5​​)为数列中最大素数的上界。

输出格式: 如果解存在,则在一行中按递增序输出等差最大的一组解;若解不唯一,则输出首数最大的一组解。若解不存在,则输出不超过 MAXP的最大素数。同行数字间以一个空格分隔,行首尾不得有多余空格。

—————————————————————————————
分析
首先给定了maxp为素数的最大上界,我们需要先把小于maxp的所有素数存起来,再找之后的等差数列。

这里放上200以内的素数表:
在这里插入图片描述
然后要求输出首数最大的解,所以从后往前进行筛选,设定i为最后一个,j为i-1个,公差就是sushu[i]-sushu[j],再判断j之前的所有素数中满足sushu[p]+公差==sushu[j]的情况存入备选数组中。因为要找到公差最大的那个解,所以我把备选数组设为二维的把每个满足上述条件的解都存进去,最后找到公差最大的位置以此来找到备选数组中相应的解。(别忘了无解情况,代码中flag控制)

代码如下:(如有错误欢迎大家指出,等我买个劵再验证一下再来更新)

/*
2004 年,陶哲轩(Terence Tao)和本·格林(Ben Green)证明了:对于任意大的 n,均存在 n 项全由素数组成的等差数列。
例如 { 7,37,67,97,127,157 } 是 n=6 的解。本题就请你对给定的 n 在指定范围内找出一组最大的解。

输入格式:
输入在一行中给出两个正整数:n(≤ 10)为等差素数数列的项数; MAXP (2 ≤ MAXP <= 1e5)为数列中最大素数的上界。

输出格式:
如果解存在,则在一行中按递增序输出等差最大的一组解;若解不唯一,则输出首数最大的一组解。若解不存在,则输出不超过 MAXP 的最大素数。同行数字间以一个空格分隔,行首尾不得有多余空格。

*/

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
int sushu[100000]={2};
int creat_su(int end){
	int i,j,flag,cnt=1;
	for(i=3;i<=end;i+=2){
		flag=1;
		for(j=2;j<=sqrt(i);j++){
			if(i%j==0){
				flag=0;
				break;
			}
		}
		if(flag){
			sushu[cnt++]=i;
		}
	}
	return cnt;
}

int main(){
	int n,maxp,i,j,p,count,cha,end,flag=1,hang=0,k;
	cin>>n>>maxp;
	count=creat_su(maxp);//新建素数表 
	vector <int> gongcha;//存公差,最后找最大公差 
	int beixuan[10000][n];
	for(i=count-1;i>=0;i--){//i从素数表最后一个开始 
		for(j=i-1;j>=0;j--){//j从i-1开始 
			vector <int> ans;//存每次可能的解 
			ans.push_back(sushu[i]);
			ans.push_back(sushu[j]);
			cha=sushu[i]-sushu[j];//得到这一次的公差 
			end=sushu[j];//end指向当前等差数列的最后一个数 
			for(p=j-1;p>=0;p--){
				if(sushu[p]+cha==end){
					ans.push_back(sushu[p]);
					end=sushu[p];//end换成现在等差数列的最后一个数 
				}
			}
			if(ans.size()==n){//如果临时数组存的解满足条件了,存入备选数组 
				flag=0;
				gongcha.push_back(cha);
				for(p=n-1,k=0;p>=0;p--,k++){
					beixuan[hang][k]=ans[p];
				}
				hang++;
			}
		}
	}
	if(flag)	cout<<sushu[count-1]<<endl;//无解情况 
	else{
		int max=0;
		for(i=0;i<gongcha.size();i++){//找到公差数组中最大值的位置 
			if(gongcha[i]>max){
				max=gongcha[i];
				p=i;
			}
		}
		for(i=0;i<n;i++){//根据公差最大值位置找到该解,输出 
			cout<<beixuan[p][i];
			if(i!=n-1)	cout<<" ";
		}
	}
	/*for(i=0;i<count;i++){
		cout<<sushu[i]<<" ";
		if(i!=0&&i%10==0)	cout<<endl;
	}*/
	return 0;
}

总结:

希望下回能满了,就可以去甲级了[苦涩]

标签:PAT,int,素数,考试题,公差,flag,2021,sushu,end
来源: https://blog.csdn.net/jiaoooooo/article/details/115557397