记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