PAT (Basic Level) Practice C++解题过程(暴躁版)
Posted 猫头丁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT (Basic Level) Practice C++解题过程(暴躁版)相关的知识,希望对你有一定的参考价值。
暴躁小丁开始准备刷PAT,虽然咱是菜鸡一个,整个一摸眼黑,但是有勇气谁都了不起,记录开始,这是一个浙江大学的刷题网站,有兴趣的宝宝可以和俺老丁一起!
链接:https://pintia.cn/problem-sets/994805260223102976/problems/type/7
1001 害死人不偿命的(3n+1)猜想
哈哈,这个名字取得也太搞笑了,害死人不偿命,哈哈哈
这个还可以写个while循环就可以了,我这代码写的总觉得水平太低了,写了好多行
#include <iostream>
using namespace std;
int main()
int n;
cin >> n;
int res = 0;
while(n != 1)
res++;
if(n % 2 == 0)
n = n / 2;
else
n = (3 * n + 1) / 2;
cout << res;
return 0;
1002 写出这个数
这个题有20分,所以我们也不难想象应该难度会高一点。
我开始的时候一直想着一个大小为10^10的整数改用什么类型表示呢,如果用int肯定不行,但是float和double由没办法求余,可把我急坏了,结果呢,就想着尝试一下,把输入改成string,这下大小啥的都没问题了,没想到竟然真的可以。
不过我发现,这个系统有个自定义输入输出的功能真的不错,在线编程体验非常好!
#include<iostream>
#include <string.h>
using namespace std;
int main()
string n;
cin >> n;
int res = 0;
for(int i = 0 ; i < n.length() ; i++)
res = res + n[i] -'0';
string s = to_string(res);
string num[10] = "ling","yi","er","san","si","wu","liu","qi","ba","jiu";
cout << num[s[0]-'0'];
for(int i = 1 ; i < s.length() ; i++)
cout << ' ' << num[s[i]-'0'];
return 0;
1003 我要通过!
这一题真的写的太暴躁了,真的看不懂题目再说啥,人家样例里面的APAAATAA,多好一串字符串,到底是哪里不满足题意,为啥给人家个NO,这不是欺负老实人吗?总之看的我云里雾里,题目中搞得那几个a,b,c也完全不知所云,把题目写清楚一点好吗?
啊,我刚刚去看了看别的博主的解题思路,原来是这个意思,【大哭】,果然我是笨蛋,【大哭】。
#include<iostream>
#include<string.h>
using namespace std;
int main()
int n;
cin >> n;
for(int i = 0 ; i < n ; i++)
string s;
cin >> s;
int a1 = 0, a2 = 0, a3 = 0;
int j = 0;
int flag = 0;
while(s[j] == 'A' && j < s.length())
a1++;
j++;
if(s[j] != 'P')
flag = 1;
j++;
while(s[j] == 'A' && j < s.length())
a2++;
j++;
if(s[j] != 'T')
flag = 1;
j++;
while(s[j] == 'A' && j < s.length())
a3++;
j++;
if(a1 > a3 || a2 == 0 || a1 * a2 != a3)
flag = 1;
if(flag == 1)
cout << "NO" << endl;
else
cout << "YES" << endl;
return 0;
1004 成绩排名
一个非常正常的题,很开心,嘿嘿
#include<iostream>
#include<string.h>
using namespace std;
int main()
int n;
cin >> n;
string name, nmin, nmax, id, imin, imax;
int grade, gmin, gmax;
cin >> nmin >> imin >> gmin;
nmax = nmin;
imax = imin;
gmax = gmin;
for(int i = 1 ; i < n ; i++)
cin >> name >> id >> grade;
if(grade > gmax)
nmax = name;
imax = id;
gmax = grade;
if(grade < gmin)
nmin = name;
imin = id;
gmin = grade;
cout << nmax << ' ' << imax << endl;
cout << nmin << ' ' << imin << endl;
return 0;
1005 继续(3n+1)猜想
害死人不偿命的(3n+1)猜想竟然还出了2.0版本,幸好也是个比较正常的题目,就是最后搞格式搞了很久,输出最后不能加空格,结果最后又洋洋洒洒写了好多行代码来解决这个问题。
#include<iostream>
#include<unordered_set>
#include <vector>
#include<algorithm>
using namespace std;
int main()
int n;
cin >> n;
vector<int> num(n);
unordered_set<int> set;
for(int i = 0 ; i < n ; i++)
cin >> num[i];
int temp = num[i];
while(temp != 1)
if(temp % 2 == 1)
temp = (3 * temp + 1) / 2;
else
temp = temp / 2;
set.insert(temp);
sort(num.begin(), num.end());
int i ;
for(i = n - 1 ; i >= 0 ; i--)
if(set.count(num[i]) == 0)
cout << num[i] ;
i--;
break;
for(; i >= 0 ; i--)
if(set.count(num[i]) == 0)
cout << ' ' << num[i] ;
return 0;
1006 换个格式输出整数
看到这题分数是15,心里已经开始嘿嘿了,复杂题我唯唯诺诺,简单题我重拳出击
#include<iostream>
#include<string.h>
using namespace std;
int main()
int n;
cin >> n;
for(int i = 0 ; i < n / 100 ; i++)
cout << 'B';
for(int i = 0 ; i < (n / 10) % 10 ; i++)
cout << 'S';
for(int i = 1 ; i <= n % 10 ; i++)
cout << i;
cout << endl;
return 0;
1007 素数对猜想
救命,我这眼睛估计是有点问题了,我看题目写着“不超过”,但是我脑子中一直是不包含该对象,结果提交的时候,有一个怎么都是错的。【大哭】,有人相爱,有人夜里看海,有人一道简单题抠了一下午才抠出来。
#include<vector>
#include<iostream>
using namespace std;
bool sushu(int n)
if(n < 4)
return true;
int i = 2;
while(i * i < n)
if(n % i == 0)
break;
i++;
return i * i > n;
int main()
int n;
cin >> n;
vector<int> temp;
for(int i = 1 ; i <= n ; i++)
if(sushu(i))
temp.push_back(i);
int res = 0;
for(int i = 1 ; i < temp.size() ; i++)
if(temp[i] - temp[i-1] == 2)
res++;
cout << res << endl;
return 0;
1008 数组元素循环右移问题
现在时间是17:37,我真的快要饿死了,自从回到学校,我每天都饿的厉害。虽然我中午干了一大碗白米饭,但是还没撑四个小时,我就已经肚子开始叫唤了。赶紧写完这个1008去吃饭,凑个吉利点的数字,结束今天的代码生活,可偏偏这么一道题,一直提示“格式错误”,哇,我心想,就饶过我吧,怎么又爆出个格式错误哇!一看题目,原来n和m都可能等于0,那难怪了,你俩好兄弟,要格式有问题一起有问题,赶紧乖乖改了代码。
嵌了几层if循环后,我的代码开始有了曲线,终于不是直杆了。干饭去了!明天再来!
#include<iostream>
using namespace std;
int main()
int n, m;
cin >> n >> m;
int A[n];
for(int i = 0 ; i < n ; i++)
cin >> A[i];
m = m % n;
if(m == 0)
if(n != 0)
cout << A[0];
for(int i = 1 ; i < n; i++)
cout << ' ' << A[i];
else
if(n != 0)
cout << A[n-m];
for(int i = n - m + 1 ; i < n ; i++)
cout << ' ' << A[i];
for(int i = 0 ; i < n - m; i++)
cout << ' ' << A[i];
cout << endl;
return 0;
1009 说反话
我真的很喜欢用,每次看到这个vector,我脑子中就会情不自禁地想到维克多,嘿嘿,有点梦幻联动的感觉,不知道有没有人看过《冰上的尤里》,里面的俄罗斯老妖精维克多,嘿嘿,不小心暴露了自己的腐女属性。
#include<iostream>
#include<vector>
using namespace std;
int main()
string s;
vector<string> res;
while(cin >> s)
res.push_back(s);
cout << res[res.size() - 1];
for(int i =res.size() - 2 ; i >= 0 ; i--)
cout << ' ' << res[i];
cout << endl;
return 0;
1010 一元多项式求导
一顿操作猛如虎,一看得分错的离谱。不知道是不是只有我这么觉得,这些题目出得好多我都看不懂什么意思,比如说这句《注意“零多项式”的指数和系数都是 0,但是表示为 0 0》,原来他的意思是,最后所有相加如过全是0,要输出“0 0”,我还以为是只要出现指数和系数都为0的就输出“0 0”,【笑哭】
#include<iostream>
#include<vector>
using namespace std;
int main()
int n1, n2;
vector<vector<int>> res;
while(cin >> n1 >> n2)
vector<int> temp;
if(n2 != 0)
temp.push_back(n1 * n2);
temp.push_back(n2 - 1);
res.push_back(temp);
if(res.size() > 0)
cout << res[0][0] << ' ' << res[0][1];
for(int i = 1 ; i < res.size() ; i++)
cout<< ' ' << res[i][0] << ' ' << res[i][1];
else
cout << "0 0";
return 0;
1011 A+B 和 C
这个题看似简单,实则暗藏玄机,虽然 3 个整数 A、B 和 C都是给定区间内的 但是,A和B相加有可能是超过int的表示范围,所以要用double,真的到处都是坑啊,头脑简单的我真的是寸步难行
#include<iostream>
using namespace std;
int main()
int n;
cin >> n;
double a, b, c;
for(int i = 0 ; i < n ; i++)
cin >> a >> b >> c;
if(a + b > c)
cout << "Case #" << i + 1 << ": " << "true" << endl;
else
cout << "Case #" << i + 1 << ": " << "false" << endl;
return 0;
1012 数字分类
这道题真的写的我百思不得其解,尤其是这个样例2,这明显8%5=3啊。为啥答案是N呢,这不是欺负我眼神不好吗?我真的是实在不能理解,我找了同学一起来看,她也不能理解,我们两个人用手机自带计算器计算8%5,结果就是3啊,感觉自己的世界观马上就被颠覆了,结果同学又看了一遍题目,告诉我,前面这个8指的是总共输入的数字个数,并不包含在内。【尴尬】【笑哭】,看来我是真的眼神不好【笑哭】
#include<iostream>
#include"stdio.h"
using namespace std;
int main()
int i = 0, a1 = 0, a2 = 0, a3 = 0, a5 = 0;
double a4 = 0;
int f1 = 0, f2 = 0, f3 = 0, f4 = 0, f5 = 0;
int x;
int flag = -1;
cin >> x;
while(cin >> x)
if(x % 10 == 0)
f1++;
a1 = a1 + x;
else if(x % 5 == 1)
f2++;
flag = flag * (-1);
a2 = a2 + flag * x;
else if(x % 5 == 2PAT(Basic Level) 1004