ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

记2021春季PAT乙级考试题解

2021-04-09 19:29:46  阅读:201  来源: 互联网

标签:PAT int 素数 考试题 公差 flag 2021 sushu end


记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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有