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乙级刷以往考试题的总结的主要内容,如果未能解决你的问题,请参考以下文章

PAT-乙级-1049 数列的片段和

PAT-2019年冬季考试-乙级(题解)

PAT乙级1049 数列的片段和 (20 分)

PAT 乙级 1049 数列的片段和

pat可以直接考甲级吗

[PAT乙级]1041 考试座位号