PAT乙级题解合集

博主分享了PAT乙级题目的解题思路和代码,包括多种算法和编程技巧,如排序、进制转换、链表操作等。通过练习这些题目,有助于提升C语言编程基础和算法应用能力。
摘要由CSDN通过智能技术生成

这么就没练了来练练手,听说乙级都是水题暑假开始正式连前就先把乙级刷完吧,免得开始训练的时候手生,第一步计划是刷完乙级,然后开始水CF
题目在牛客网上刷的据说牛客上的数据比PAT官网要难点儿,放上传送门:牛客网PAT PAT官网
o(︶︿︶)o ,收回我的话,据说是不可信的,在牛客上全过的在官网有WA了9发,还是官网靠谱,明天奋斗找坑补题(ಥ _ ಥ)

随便说说


牛客上的三十道题目做完了,加起来差不多做了三个下午,真的是应了知乎上不知哪位说的,乙级最难到排序。乙级的题目用来练基础还是很不错的,虽然有的超级水不过就算是基础差点儿的所有的题目也应该是看看有思路的,最起码能拿到大分,乙级的话基本上稍微练练90+是没问题的,应陈越姥姥说的:“设立乙级还是因为有企业需要的,不是所有企业都要算法和英文很厉害的,能敲代码就是好娃”。具体的记不清楚了,大概就是这么个意思,身为一个ACMer感觉到了赤果果的嘲讽,so~,还是好好学英文去打甲级顶级吧

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

思路:

可以递归也可以循环,递归算最简单

代码:

#include <iostream>

using namespace std;
int _3n(int n)
{
    if(n==1) return 0;
    if(n&1) return _3n((n*3+1)/2)+1;
    else return _3n(n/2)+1;
}
int main()
{
    int n;
    cin>>n;
    cout<<_3n(n)<<endl;
    return 0;
}

1002 写出这个数 (20)

思路:

水题

代码:

#include <bits/stdc++.h>

using namespace std;
string shu[]={
  "ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"};
int main()
{
    char ch,num[100];
    int sum=0;
    while(~scanf("%c",&ch)&&ch!='\n')
    {
        sum+=ch-'0';
    }
    sprintf(num,"%d",sum);
    cout<<shu[num[0]-'0'];
    for(int i=1;i<strlen(num);i++)
    {
        cout<<' '<<shu[num[i]-'0'];
    }
    cout<<endl;
    return 0;
}

1003 我要通过!(20)

思路:

字符串题目,一直都是比较弱也是怕的题目比较考验细心和耐心,这个要注意到题目上递推的关系

代码:

#include <bits/stdc++.h>

using namespace std;
int judge_1(char s[])
{
    int l=strlen(s),p=1,t=1;
    for(int i=0;i<l;i++)
    {
        if(!(s[i]=='P'||s[i]=='A'||s[i]=='T'))
            return 0;
        if(s[i]=='P')
        {
            if(p) p=0;
            else return 0;
        }
        if(s[i]=='T')
        {
            if(t) t=0;
            else return 0;
        }
    }
    return 1;
}
int judge_2(char s[])
{
    int l=strlen(s),p,t;
    for(int i=0;i<l;i++)
    {
        if(s[i]=='P') p=i;
        if(s[i]=='T') t=i;
    }
    if(t-p>1&&p*(t-p-1)==l-t-1)
    {
        return 1;
    }
    else return 0;
}
int judge(char s[])
{
    return (judge_1(s)&&judge_2(s));
}
int main()
{
    int n;
    char s[105];
    cin>>n;
    while(n--)
    {
        scanf("%s",s);
        if(judge(s))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

1004 成绩排名 (20)

思路:

直接比较

代码:

#include <iostream>

using namespace std;

int main()
{
    string name_max,xh_max,name_min,xh_min,s,s2;
    int max=-1,min=999,ans,n;
    cin>>n;
    while(n--)
    {
        cin>>s>>s2>>ans;
        if(ans>max)
        {
            max=ans;
            name_max=s;
            xh_max=s2;
        }
        if(ans<min)
        {
            min=ans;
            name_min=s;
            xh_min=s2;
        }
    }
    cout<<name_max<<' '<<xh_max<<endl<<name_min<<' '<<xh_min<<endl;
    return 0;
}

1005 继续(3n+1)猜想 (25)

思路:

暴力

代码:

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
map<int ,int>mp;
int _3n(int n)
{
    if(n==1) return 1;
    if(n&1)
    {
        if(!mp[(n*3+1)/2]) mp[(n*3+1)/2]=_3n((n*3+1)/2);
        return mp[(n*3+1)/2]+1;
    }
    else
    {
        if(!mp[n/2]) mp[n/2]=_3n(n/2);
        return mp[n/2]+1;
    }
}
int main()
{
    int n,a[105],flag=1;

    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        mp[a[i]]=0;
    }
    sort(a,a+n);
    for(int i=n-1;i>=0;i--)
    {
        _3n(a[i]);
    }
    for(map<int,int>::reverse_iterator it=mp.rbegin();it!=mp.rend();it++)
    {
        //cout<<"key:"<<it->first<<' '<<"ve:"<<it->second<<endl;
        if(it->second==0)
        {
            if(flag)
            {
                cout<<it->first;
                flag=0;
            }
            else
            {
                cout<<' '<<it->first;
            }
        }
    }
    cout<<endl;
    return 0;
}

1006 换个格式输出整数 (15)

思路:

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    char s[5];
    cin>>n;
    sprintf(s,"%03d",n);
    for(int i=0;i<s[0]-'0';i++) printf("B");
    for(int i=0;i<s[1]-'0';i++) printf("S");
    for(int i=0;i<s[2]-'0';i++) printf("%d",i+1);
    cout<<endl;
    return 0;
}

1007. 素数对猜想 (20)

思路:

代码:

#include <bits/stdc++.h>

using namespace std;
int judeg(int n)
{
    for(int i=2;i<sqrt(n)+1;i++)
    {
        if(n%i==0) return 0;
    }
    return 1;
}
void init(int a[],int n)
{
    int k=0;
    for(int i=2;i<=n+1;i++)
    {
        if(judeg(i)) a[k++]=i;
    }
}
int main()
{
    int n,a[10005],sum=0;
    cin>>n;
    init(a,n);
    for(int i=0;a[i+1]<=n;i++)
    {
        if(a[i+1]-a[i]==2) sum++;
    }
    cout<<sum<<endl;
    return 0;
}

1008 数组元素循环右移问题 (20)

思路:

循环输出,不用储存

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,k,a[105];
    cin>>n>>k;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=n-(k%n);i<2*n-(k%n);i++)
    {
        printf("%d%c",a[i%n],i==2*n-(k%n)-1?'\n':' ');
    }
    return 0;
}

1009 说反话 (20)

思路:

还是水,用一个string的栈存然后输出

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    stack<string>st;
    string s;
    while(cin>>s) st.push(s);
    cout<<st.top();st.pop();
    while(!st.empty())
    {
        cout<<' '<<st.top();
        st.pop();
    }
    cout<<endl;
    return 0;
}

1010 一元多项式求导 (25)

思路:

比较坑,题目上说的不清晰,输入的系数和质数都为0时什么都不输出,如果输入是空输出“0 0”。

代码:

#include <bits/stdc++.h>

using namespace std;
int flag=0;
void fx(int a,int b)
{
    if(a*b) 
    {   
        if(flag) cout<<' '; flag=1;
        printf("%d %d",a*b,b-1);
    }
}
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        fx(a,b);
    }
    if(!flag) printf("0 0\n");
    return 0;
}

1011 A+B和C (15)

思路:

水题不用思路

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    long long a,b,c;
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld%lld",&a,&b,&c);
        if((a+b)>c)
            printf("Case #%d: true\n",i);
        else
            printf("Case #%d: false\n",i);
    }
    return 0;
}

1012 数字分类 (20)

思路:

按照要求分类就好,比较繁琐,写了无数if -_-!

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;cin>>n;
    int a1=0,s1=0,a2=0,s2=0,a3=0,s3=0,a4=0,s4=0,a5=-0x3f3f3f3f,s5=0;
    while(n--)
    {
        int ans;
        cin>>ans;
        switch(ans%5)
        {
        case 0:
            if(!(ans%2))
            {
                a1+=ans;
                s1++;
            }
            break;
        case 1:
            if(!(s2%2))
                a2+=ans;
            else
                a2-=ans;
            s2++;
            break;
        case 2:
            s3++;
            break;
        case 3:
            a4+=ans;
            s4++;
            break;
        case 4:
            a5=max(a5,ans);
            s5++;
            break;
        }
    }
    if(!s1)
        cout<<'N'<<' ';
    else
        cout<<a1<<' ';
    if(!s2)
        cout<<'N'<<' ';
    else
        cout<<a2<<' ';
    if(!s3)
        cout<<'N'<<' ';
    else
        cout<<s3<<' ';
    if(!s4)
        cout<<'N'<<' ';
    else
        printf("%.1lf ",a4*1.0/s4);
    if(!s5)
        cout<<'N'<<endl;
    else
        cout<<a5<<endl;

    return 0;
}

1013 数素数 (20)

思路:

打表存1w个素数,筛法打表,普通方法不知道超不超,然后输出就好,隔是个要换行一次。

代码:

#include <bits/stdc++.h>

using namespace std;
int a[104799]={
  0},su[10005];
void init()
{
    int k=0;
    a[0]=a[1]=1;
    for(int i=2;i<104799&&k<10005;i++)
    {
        if(!a[i])
        {
            su[k]=i;
            k++;
            for(int j=i+i;j<104799;j+=i)
            {
                a[j]=1;
            }
        }
    }
}

int main()
{
    init();
    int n,m;
    cin>>n>>m;
    for(int i=n;i<=m;i++)
    {
        if((i-n+1)%10==0||i==m)
            printf("%d\n",su[i-1]);
        else
            printf("%d ",su[i-1]);
    }
    return 0;
}

1014 福尔摩斯的约会 (20)

思路:

这个题略坑,刚开始理解错了两次都以为是顺序往下找相同的一对,结果只用两行上下对比是不是相同就行了。然后就是注意题目上的什么大写字母,字母,数字分清每一个要找那种相同的就行了

代码:

#include <bits/stdc++.h>

using namespace std;
string DAY[7]={
  "MON","TUE","TUE","THU","FRI","SAT","SUN"};
int main()
{
    char s[200],s2[100];
    scanf("%s",s);
    int l=strlen(s),l2,flag=0,hh,mm,day;
    scanf("%s",s2);
    l2=strlen(s2);
    map<char, int>mp;
    for(int i=0;i<l;i++)
        mp[s[i]]=1;
    for(int i=0;i<l2;i++)
    {
        if(s2[i]==s[i])
        {
            if(!flag&&s2[i]>='A'&&s2[i]<='Z')
            {
                flag=1;
                day=s2[i]-'A';
            }
            else if(flag&&(s2[i]>='A'&&s2[i]<='N'||s2[i]>='0'&&s2[i]<='9'))
            {
                if(s[i]>='0'&&s[i]<='9')
                    hh = s2[i]-'0';
                else
                    hh = s2[i]-'A'+10;
                break;
            }
        }
    }
    scanf("%s",s);
    l=strlen(s);
    scanf("%s",s2);
    l2=strlen(s2);
    mp.clear();
    for(int i=0;i<l;i++)
        mp[s[i]]=1;
    for(int i=0;i<l2;i++)
    {
        if(s2[i]==s[i]&&(s2[i]>='A'&&s2[i]<='Z'||s2[i]>='a'&&s2[i]<='z'))
        {
            mm=i;
            break;
        }
    }
    cout<<DAY[day];
    printf(" %02d:%02d\n",hh,mm);
    return 0;
}

1015 德才论 (25)

思路:

排序的题目,不过条件太多并且麻烦需要细心的分类和写cmp函数,定义一个结构体储存一个人的所有信息,只要分类和cmp函数没搞错,就直接用sort排序输出就行了。

代码:

#include <bits/stdc++.h>

using namespace std;
struct node{
    int id,de,ca,lei,zong;
};
int cmp(node a,node b)
{
    if(a.lei==b.lei)
    {
        if(a.zong==b.zong)
        {
            if(a.de==b.de)
                return a.id<b.id;
            return a.de>b.de;
        }
        return a.zong>b.zong;
    }
    return a.lei<b.lei;
}
int main()
{
    int sum=0,n,l,h;
    node a[100005],ans;
    cin>>n>>l>>h;
    while(n--)
    {
        scanf<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值