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

PAT Basic Level 1004

PAT(Basic Level)practice1004

PAT Basic Level 1033

PAT Basic Level 1009

PAT Basic Level 1011