【题解】PAT (Basic Level) Practice (中文)

一篇博客,详细介绍了PAT(Basic Level)的多个算法题目,包括(3n+1)猜想、数字分类、数组元素循环右移、一元多项式求导等,旨在记录作者的学习过程并分享解题思路。
摘要由CSDN通过智能技术生成

       互联网行业的小白,写博客的目的是为了记录自己的学习过程、对自己学习中所犯的错误做一个总结。由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!

1001 害死人不偿命的(3n+1)猜想

题目传送门:害死人不偿命的(3n+1)猜想

#include<iostream>
using namespace std;

int main(){
   
    int n;
    cin>>n;
    int count=0;
    if(n!=1){
   //注意n为1的情况!
        while(1){
   
            if(n%2==1)
                n=3*n+1;
            n/=2;
            count++;
            if(n==1) break;
        }
    }
    cout<<count;
    return 0;
}

1002 写出这个数

题目传送门:写出这个数

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

int main(){
   
    char str;
    int sum=0;
    while((str=getchar())!='\n')
        sum += (str - '0');

    if(sum==0) cout<<"ling"<<endl;//输入为0的情况另外考虑,不过对本题无影响!

    int b[101],j=0;
    while(sum){
   //将求和后sum的每一位存在数组b中
        b[j++]=sum%10;
        sum/=10;
    }

    for(int i=j-1;i>=0;i--){
   
        switch(b[i]){
   
        case 0:
            cout<<"ling";break;
        case 1:
            cout<<"yi";break;
        case 2:
            cout<<"er";break;
        case 3:
            cout<<"san";break;
        case 4:
            cout<<"si";break;
        case 5:
            cout<<"wu";break;
        case 6:
            cout<<"liu";break;
        case 7:
            cout<<"qi";break;
        case 8:
            cout<<"ba";break;
        case 9:
            cout<<"jiu";break;
        }
        if(i!=0) cout<<" ";//注意最后一个没有空格
    }
    return 0;
}

1003 我要通过!

题目传送门:我要通过!

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
   
    int n;
    cin>>n;
    getchar();
    string *str = new string[n];
    for(int i=0;i<n;i++)
        getline(cin,str[i]);
    for(int i=0;i<n;i++){
   
        int nP=0,nA=0,nT=0;
        bool flag=false;
        for(int j=0;j<str[i].size();j++){
   
            if(str[i][j]=='P') nP++;
            if(str[i][j]=='A') nA++;
            if(str[i][j]=='T') nT++;
        }
        if(nP==1&&nT==1&&nA>0&&nP+nA+nT==str[i].size()) flag=true;//nA>0是为了防止出现没有A的情况
        if(!flag){
   
            cout<<"NO"<<endl;
        }
        else{
   
            int len_l=0,len_m=0,len_r=0,j=0;
            for(j=0;j<str[i].size();j++){
   
                if(str[i][j]=='P') {
   
                    len_l=j;
                    break;
                }
            }
            j++;
            while(str[i][j]!='T'){
   
                len_m++;
                j++;
            }
            j++;
            len_r=str[i].size()-j;
            if(len_l*len_m==len_r) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
    return 0;
}

1004 成绩排名

题目传送门:成绩排名

#include<iostream>
#include<string>
using namespace std;

struct Student{
   
    string name;
    string num;
    int score;
};

int main(){
   
    int n;
    cin >> n;
    Student *stu = new Student[n];
    for (int i = 0; i < n; i++){
   
        cin >> stu[i].name >> stu[i].num >> stu[i].score;
    }
    int max = stu[0].score, f1=0;
    int min = stu[0].score, f2=0;
    for (int i = 0; i < n; i++){
   
        if (stu[i].score>max){
   
            max = stu[i].score;
            f1 = i;
        }
        if (stu[i].score < min){
   
            min = stu[i].score;
            f2 = i;
        }
    }
    cout << stu[f1].name << " " << stu[f1].num << endl;
    cout << stu[f2].name << " " << stu[f2].num << endl;
}

1005 继续(3n+1)猜想

题目传送门: 继续(3n+1)猜想

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;

bool cmp(int a,int b){
   
    return a>b;
}

int main(){
   
    int n;
    cin>>n;
    int *p = new int[n];
    for(int i=0;i<n;i++)
        cin>>p[i];
    set<int>s;
    for(int i=0;i<n;i++){
   
        int temp=p[i];
        while(1){
   
            if(temp%2!=0) temp=3*temp+1;
            temp/=2;
            s.insert(temp);
            if(temp==1) break;
        }
    }
    set<int>::iterator it;
    vector<int>ans;//用于存放结果的向量
    for(int i=0;i<n;i++){
   
        int count=0;
        for(it=s.begin();it!=s.end();++it){
   
            if(p[i]!=*it) count++;
            if(count==s.size()) ans.push_back(p[i]);
        }
    }
    sort(ans.begin(),ans.end(),cmp);//为了从大到小输出
    for(int i=0;i<ans.size();i++){
   
        if(i==ans.size()-1) cout<<ans[i];
        else cout<<ans[i]<<" ";
    }
    return 0;
}

1006 换个格式输出整数

题目传送门:换个格式输出整数

#include<iostream>
using namespace std;

int main(){
   
    int n;
    cin >> n;

    int a[5], k = 0;
    while (n){
   
        a[k++] = n % 10;
        n /= 10;
    }
    if (k == 3){
   
        for (int i = 0; i < a[2]; i++)
            cout << 'B';
        k--;
    }
    if (k == 2){
   
        for (int i = 0; i < a[1]; i++)
            cout << 'S';
        k--;
    }
    if (k == 1){
   
        for (int i = 1; i <= a[0]; i++)
            cout << i;
    }
    return 0;
}

1007 素数对猜想

题目传送门:素数对猜想

#include<iostream>
#include<math.h>
using namespace std;

bool Is_Prime(int n){
   
    if (n < 2) return false;
    for (int i = 2; i <= sqrt(n); i++){
   
        if (n%i == 0) return false;
    }
    return true;
}

int main(){
   
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 2; i <= n; i++){
   
        if (Is_Prime(i) && Is_Prime(i-2))
            ans++;
    }
    cout << ans;
    return 0;
}

1008 数组元素循环右移问题

题目传送门: 数组元素循环右移问题

#include<iostream>
using namespace std;

int main(){
   
    int n, m;
    cin >> n >> m;

    int *a = new int[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int f = m%n;//当大于数组的长度时,直接取模减少移动次数

    for (int i = n - f; i < n; i++)
        cout << a[i] << " ";
    for (int i = 0; i < n - f; i++){
   
        if (i != n - f - 1) cout << a[i] << " ";
        else cout << a[i];//输出的最后一个没有空格
    }
    return 0;
}

1009 说反话

题目传送门: 说反话

#include<iostream>
#include<string>
using namespace std;

int main(){
   
    string str;
    getline(cin, str);

    int k = 0,j;
    char *p = new char[str.size()];
    for (int i = str.size() - 1; i >= 0; i--){
   
        if (str[i] != ' '){
   
            p[k++] = str[i];
        }
        else{
   
            for (j = k - 1; j >= 0; j--)
                cout << p[j];
            cout << " ";
            k = 0;
        }
    }
    for (j = k - 1; j >= 0; j--)//第一个字符串还没有输出。
        cout << p[j];
    //或者下面这样也行:
    /*
    for (int i = 0; i < str.size(); i++){//输出第一个字符串
        if (str[i] == ' ') break;
        else cout << str[i];
    }
    */
    return 0;
}

1010 一元多项式求导

题目传送门:一元多项式求导

#include<iostream>
using namespace std;

int main(){
   
    int a,b;
    bool flag = false;
    while(cin>>a>>b){
   
        if(a*b){
   
            if(!flag)
                flag=true;
            else
                cout<<" ";
            cout<<a*b<<" "<<b-1;
        }
    }
    if(!flag)
        cout<<"0 0"<<endl;
    return 0;
}

1011 A+B 和 C

题目传送门:A+B 和 C

#include<iostream>
using namespace std;

int main(){
   
    long long T,a,b,c;
    cin>>T;
    for(int i=0;i<T;i++){
   
        cin>>a>>b>>c;
        if(a+b<=c) cout<<"Case #"<<i+1<<": false"<<endl;
        else cout<<"Case #"<<i+1<<": true"<<endl;
    }
    return 0;
}

1012 数字分类

题目传送门:数字分类

#include<iostream>
#include<iomanip>
using namespace std;

int main(){
   
    int n;
    cin>>n;
    bool flag1=false,flag2=false,flag3=false,flag4=false,flag5=false;
    int *p=new int[n];
    for(int i=0;i<n;i++)
        cin>>p[i];
    int A1=0,A2=0,A3=0,A5=0;
    float A4=0.0;
    int *tempA5=new int[n],kA4=0,kA5=0,cnt=0;
    for(int i=0;i<n;i++){
   
        int select=p[i]%5+1;
        switch(select){
   
            case 1:
                if(p[i]%2==0){
   
                    A1+=p[i];
                    flag1=true;
                }
                break;
            case 2:
                if(cnt%2!=0) p[i]=-p[i];
                A2+=p[i];
                cnt++;
                flag2=true;
                break;
            case 3:
                A3++;
                flag3=true;
                break;
            case 4:
                A4+=p[i];
                kA4++;
                flag4=true;
                break;
            default:
                tempA5[kA5++]=p[i];
                flag5=true;
                break;
        }
    }
    A4=(float)A4/kA4;//容易错,用强制类型转换
    A5=tempA5[0];
    for(int i=0;i<kA5;i++){
   
        if(tempA5[i]>A5) A5=tempA5[i];
    }
    if(!flag1) cout<<'N'<<" ";
    else cout<<A1<<" ";
    if(!flag2) cout<<'N'<<" ";
    else cout<<A2<<" ";
    if(!flag3) cout<<'N'<<" ";
    else cout<<A3<<" ";
    if(!flag4) cout<<'N'<<" ";
    else cout<<setiosflags(ios::fixed)<<setprecision(1)<<A4<<" ";//不加setiosflags(ios::fixed)输出格式错误
    if(!flag5) cout<<'N';
    else cout<<A5;
    return 0;
}

1013 数素数

题目传送门: 数素数

#include<iostream>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值