PAT乙级刷以往考试题的总结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT乙级刷以往考试题的总结相关的知识,希望对你有一定的参考价值。
刚报名了PAT乙级的比赛,故做了几套试试水。PAT乙级还是比较简单的,但是想要拿满分还是有那么点难的。
因为有的测试点特别的恶心。
用金币白嫖了PAT2015和2017的题,不得不说白嫖的真的没好货。
用金币买的以往考试的试题都是PAT题库的题。所以用好几年前的题来看一下难度着实没有意义。
于是冲了10元买了今年的两套的试题,毕竟报名费200多都花了,这点钱也就无所谓了。
PAT(乙级)2015年春季考试
做2015年的题还是比较简单的,毕竟乙级题库我已经刷完了,这都是原题,做起来还是比较丝滑的。
就最后一题,debug调了会儿,其它基本一发AC。
PAT(乙级)2017年春季考试
这套题还不错,有的题稍微有点坑。不过难度不大。
PAT(乙级)2020年冬季考试
这套题真的有点难,主要是第三题太难了。有的特殊点真的难debug。
最终98分,其实严格的来说是94分因为最后一题,我用的双指针搞的,只有21分,后来搜了一下其实直接暴力就可AC了。
看来有时候不要想复杂了,当遇到一个坎时不妨换一个简单的思路试试。
因为版权原因题目就不上传了,只上代码。
第一题: 模拟
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
for(int i=0;i<n;i++)
{
int x; cin>>x;
if(x<10) cout<<"Yes";
else
{
string s=to_string(x);
s="0"+s;
int sum=0;
bool flag=false;
for(int i=1;i<s.size();i++)
{
sum=sum*10+s[i]-'0';
if(sum%i!=0) flag=true;
}
if(flag) cout<<"No";
else cout<<"Yes";
}
if(i!=n-1) cout<<endl;
}
return 0;
}
第二题: 主要考察异或运算 当然你直接统计再找也可以
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
int sum=0;
for(int i=0;i<n;i++)
{
int x; cin>>x;
if(x%2) sum^=x;
}
cout<<sum<<endl;
return 0;
}
第三题: 就是模拟运算就可以了不过步骤有点麻烦
18分的代码,有时间补完
#include<bits/stdc++.h>
using namespace std;
string f(string s)
{
int t=0;
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]=='.') continue;
int k=t+s[i]-'0';
t=k/10;
s[i]='0'+k%10;
}
if(t) s="1"+s;
return s;
}
int main(void)
{
int n,d; cin>>n>>d;
for(int i=0;i<n;i++)
{
int op;
string s; cin>>op>>s;
if(s.find('.')!=-1)
{
int index=s.find('.');
while(index>1&&s[0]=='0') s=s.substr(1),index--;
index=s.find('.');
int len=s.size()-1-index;
while(len<d+2) s=s+"0",len++;
if(op==1)
{
string ans=s.substr(0,index+1)+s.substr(index+1,d+1);
if(ans[ans.size()-1]>='5') ans[ans.size()-2]+=1;
ans=ans.substr(0,ans.size()-1);
ans=f(ans);
cout<<ans;
}
else if(op==2)
{
string ans=s.substr(0,index+1)+s.substr(index+1,d);
cout<<ans;
}
else if(op==3)
{
string ans=s.substr(0,index+1)+s.substr(index+1,d+1);
if(ans[ans.size()-1]=='5')
{
int temp=stoi(s.substr(index+d+2));
if(temp)
{
ans[ans.size()-2]+=1;
ans=f(ans);
}
else
{
int k=ans[ans.size()-2]-'0';
if(k&1) ans[ans.size()-2]+=1;
ans=f(ans);
}
}
else if(ans[ans.size()-1]>='6')
{
ans[ans.size()-2]+=1;
ans=f(ans);
}
ans=ans.substr(0,ans.size()-1);
ans=f(ans);
cout<<ans;
}
}
else
{
string ans=s;
while(s.size()>1&&s[0]=='0') s=s.substr(1);
ans+=".";
int k=0;
while(k!=d) ans+="0",k++;
cout<<ans;
}
if(i!=n-1) cout<<endl;
}
return 0;
}
第四题: 斐波那契找一下就可以了
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
long long int a[N];
int ans;
int main(void)
{
int index=1e9;
a[0]=0,a[1]=1;
int n; cin>>n;
for(int i=2;i<=90;i++) a[i]=a[i-1]+a[i-2];
for(int i=0;i<=90;i++)
{
if(abs(a[i]-n)<index)
{
ans=a[i];
index=abs(a[i]-n);
}
}
cout<<ans;
return 0;
}
第五题: 暴力即可,记录每一个起始的下标
#include<bits/stdc++.h>
using namespace std;
vector<int>ve;
int main(void)
{
string a,b; cin>>a>>b;
for(int i=0;i<a.size();i++) if(a[i]==b[0]) ve.push_back(i);
string ans;
int len=1e5+10;
for(int i=0;i<ve.size();i++)
{
int cnt=0;
for(int j=ve[i];j<a.size();j++)
{
if(a[j]==b[cnt]) cnt++;
if(cnt==b.size())
{
string temp=a.substr(ve[i],j-ve[i]+1);
if(temp.size()<len) ans=temp,len=temp.size();
break;
}
}
}
cout<<ans;
return 0;
}
PAT(乙级)2021年春季考试
这一套题难度中规中矩吧,不像上一套有那么恶心的测试点。100分。
第一题: 找规律打印图案
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
char a,b,c; cin>>a>>b>>c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) cout<<c;
else if(i<j) cout<<a;
else cout<<b;
}
if(i!=n) cout<<endl;
}
return 0;
}
第二题: 排序
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node
{
int id;
double t;
}Node[N];
bool cmp(node a,node b)
{
if(a.t==b.t)
return a.id<b.id;
return a.t<b.t;
}
int main(void)
{
int n; cin>>n;
for(int i=0;i<n;i++)
{
int x,v; cin>>Node[i].id>>x>>v;
Node[i].t=x*1.0/v;
}
sort(Node,Node+n,cmp);
for(int i=0;i<3;i++)
{
cout<<Node[i].id;
if(i!=2) cout<<" ";
}
return 0;
}
第三题: 字符串处理
#include<bits/stdc++.h>
using namespace std;
int cnt;
string ans="pintia";
int main(void)
{
string s; getline(cin,s);
for(int i=0;i<s.size();i++) if(s[i]==','||s[i]=='.') s[i]=' ';
stringstream l(s);
string x;
while(l>>x) if(x=="pintia"||x=="Pintia") cnt++;
cout<<cnt<<endl;
if(!cnt) cout<<"wu gan";
if(cnt&&cnt<=3) cout<<"you ai";
if(cnt>3) cout<<"zhen ai la";
return 0;
}
这一道题,Debug了有一会儿,后来想了一个简单的方法搞定。
第四题: 线性筛加枚举
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5000;
int prime[N],cnt;
bool st[N];
void f()
{
int n=1e5+50;
for(int i=2;i<=n;i++)
{
if(!st[i]) prime[cnt++]=i;
for(int j=0;prime[j]<=n/i;j++)
{
st[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
int n,m;
int a[N],b[N],d=1;
bool s;
int ans1;
int main(void)
{
f();
cin>>n>>m;
for(int i=0;i<cnt;i++)//枚举每一个首相
{
if(prime[i]>m) continue;
ans1=prime[i];
if(n>1)
for(int j=10000;j>=d;j--)//从大到小枚举公差
{
bool flag=false;
int sum=prime[i]+j*(n-1);
if(sum>m) continue;
int k;
for(k=0;k<n;k++)//枚举每一项
{
a[k]=prime[i]+k*j;
if(st[a[k]]) break;
}
if(k==n)
{
flag=true,d=j;
s=true;
memcpy(b,以上是关于PAT乙级刷以往考试题的总结的主要内容,如果未能解决你的问题,请参考以下文章