pat乙级代码

寒假在家练pat的题目,已完结

目录

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

#include<stdio.h>
int main()
{
   
    int n,i;
    int step=0;
    scanf("%d",&n);
    while(n!=1)
    {
   
        if(n%2==0)
        {
   
            n=n/2;
        }
        else
        {
   
            n=(3*n+1)/2;
        }
          step++;
    }
    printf("%d",step);
    return 0;
}

B 1002 写出这个数

#include <cstdio>
#include<cstring>
int main()
{
   
    char str[120];
    int a[10];
    char b[10][10]={
   "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
    scanf("%s",str);
    int len=strlen(str);
    int temp,sum=0;
    for(int i=0;i<len;i++)
    {
   
        temp=str[i]-'0';
        sum+=temp;
    }
    int k=0;
   while(sum!=0)
   {
   
       a[k++]=sum%10;
       sum=sum/10;
   }
   for(int j=k-1;j>0;j--)
   {
   
       printf("%s ",b[a[j]]);
   }
 printf("%s",b[a[0]]);
    return 0;
}

B 1003 我要通过

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char str[12][110]={
   0};
int left;
int main()
{
   
    int n;
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
    {
   
        scanf("%s",&str[i]);
    }
    int k,t,j,p,len;
    int acount=0;
    for(j=0;j<n;j++)
    {
   
        len=strlen(str[j]);
        acount=0;
         for(i=0;i<len;i++)
    {
   
      if(str[j][i]=='P')
      {
   
          p=i;
      }
      else if(str[j][i]=='T')
      {
   
          t=i;
      }
      else if(str[j][i]=='A')
      {
   
          acount++;
      }

    }

    if((len-t-1)-p*(t-p-2)==p&&len==acount+2&&acount!=0)
    {
   
        printf("YES\n");
    }
    else
    {
   
        printf("NO\n");
    }
    }
    return 0;
}

B 1004 成绩排名

#include<cstdio>
int main()
{
   
    struct student
    {
   
       char name[11];//字符数组最后一位需要预留给'\0',大小要比给的10大一位,所以取11位。为保险起见,以后数组值可以取大点。
       char id[11];
       int grade;
    }st[100];
    int n,maxs=0,mins=100;
    int p,q;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
   
        scanf("%s%s%d",st[i].name,st[i].id,&st[i].grade);
        if(st[i].grade>maxs)
        {
   
           maxs=st[i].grade;
            p=i;
        }
            
        if(st[i].grade<mins)
        {
   
            mins=st[i].grade;
            q=i;
        }
           

    }
        printf("%s %s\n",st[p].name,st[p].id);
        printf("%s %s\n",st[q].name,st[q].id);
    return 0;
}

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

#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
   
    return a>b;
}
int main()
{
   
    int n,i,t,count=0,s[10010];
    int step=0;
    scanf("%d",&n);
    bool hash[10010]={
   false};
    for(i=0;i<n;i++)
    {
   
        scanf("%d",&s[i]);
        t=s[i];
    while(t!=1)
    {
   
        if(t%2==0)
        {
   
            t=t/2;
        }
        else
        {
   
            t=(3*t+1)/2;
        }
        hash[t]=true;
    }
    }
    sort(s,s+n,cmp);
     for(i=0;i<n;i++)
    {
   
        if(hash[s[i]]==false)
         count++;
    }
    for(i=0;i<n;i++)
    {
   
        if(hash[s[i]]==false)
        {
   
             printf("%d",s[i]);
              count--;//这里要求最后一个不要有空格输出,所以要有一个count计数,且count--的位置不能放if判断后
        if(count>0)
                printf(" ");
       
        }
    }
    return 0;
}

B 1006 换个格式输出整数

#include <cstdio>
int main()
{
   
    int i,n;
    scanf("%d",&n);
    for(i=0;i<n/100;i++)
    {
   
        printf("B");
    }
    for(i=0;i<n%100/10;i++)
    {
   
        printf("S");
    }
    for(i=1;i<=n%10;i++)
    {
   
        printf("%d",i);
    }
}

B 1007 素数对猜想

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

bool isprime(int n)
{
   
    if(n<=1)
        return false;
    int sqr=(int)sqrt(1.0*n);
    for(int i=2;i<=sqr;i++)
    {
   
        if(n%i==0)
            return false;
    }
    return true;
}

int main()
{
   
    int n,count=0;
    scanf("%d",&n);
    for(int i=3;i+2<=n;i+=2)
    {
   
        if(isprime(i)==true&&isprime(i+2)==true)
        {
   
            count++;
        }
    }
    printf("%d",count);

    return 0;
}

B 1008 数组元素循环右移问题

#include<cstdio>
int main()
{
   
    int n,m;
    int a[100];
    scanf("%d%d",&n,&m);//这一步千万别忘,因为m不一定小于n
    m=m%n;
    for(int i=0;i<n;i++)
    {
   
        scanf("%d",&a[i]);
    }
    for(int j=n-m;j<n;j++)
    {
   
        printf("%d ",a[j]);
    }
    for(int j=0;j<n-m-1;j++)
    {
   
        printf("%d ",a[j]);
    }
     printf("%d",a[n-m-1]);
    
    return 0;
}

B 1009 说反话

注意这题代码要用c,c++会编译错误,因为gets函数只能用c,c++可能就要用string容器了

#include <stdio.h>
#include<string.h>
int main()
{
   
    char str[90];
    gets(str);//这里一开始用scanf("%s",str)怎么都不对,不能这么用,不然只能接受第一个单词
    int len=strlen(str);
    char a[90][100];
    int k=0,j=0;
    for(int i=0;i<len;i++)
    {
   
        if(str[i]!=' ')
        {
   
            a[j][k++]=str[i];
        }
        else
        {
   
            a[j][k]='\0';
             j++;
             k=0;
        }
       
    }
    for(int t=j;t>0;t--)
    {
   
        printf("%s ",a[t]);
    }
     printf("%s",a[0]);
    return 0;
}

B 1010 一元多项式求导

#include<cstdio>
int main()
{
   
    int a[20]={
   0};
    int count=0;
    int temp,k;
    while(~scanf("%d %d",&temp,&k))
    {
   
        a[k]=temp;
        if(temp==0||k==0)
         continue;
        if(count==0)
             printf("%d %d",a[k]*k,k-1);
        else
             printf(" %d %d",a[k]*k,k-1);
        count++;
    }
    if(count==0)
        printf("0 0");
    return 0;
}

B 1011 A+B和C

#include<stdio.h>
int main()
{
   
    int n;
    long long a,b,c;
    scanf("%d",&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;
}

B 1012 数字分类

#include<cstdio>
using namespace std;

int main()
{
   
    int n,temp,p;
    int a,count=0;
    int A[5]={
   0};
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
   
        scanf("%d",&a);
        switch(a%5)
        {
   
        case 0:
            if(a%2==0)
            A[0]=A[0]+a;
            break;
        case 1:
            if(count%2==0)//这里同样需要一个count记录个数,不能直接用i来判断正负
                A[1]=A[1]+a;
            else
                A[1]=A[1]-a;
            count++;
              break;
        case 2:
            A[2]++;
            break;
        case 3:
            A[3]=A[3]+a;
            p++;
            break;
        case 4:
            if(a>A[4])
                A[4]=a;
            break;
        }

    }
     if(A[0]==0)
        printf("N ");
    else
        printf("%d ",A[0]);
     if(A[1]==0&&count==0)
        printf("N ");
    else
        printf("%d ",A[1]);
     if(A[2]==0)
        printf("N ");
     else
        printf("%d ",A[2]);
     if(A[3]==0)
        printf("N ");
    else
        printf("%.1f ",(double)A[3]/p);
    if(A[4]==0)
        printf("N");
    else
        printf("%d",A[4]);
}

B 1013 数素数

#include <cstring>
#include<cstdio>
#include<algorithm>
#include <iostream>
using namespace std;
const int maxn=1000001;
int prime[maxn],num=0;
bool p[maxn]={
   0};
void Find_Prime(int n){
   
 for(int i=2;i<maxn;i++){
   
    if(p[i]==false){
   
        prime[num++]=i;
             if(num>=n) break;
        for(int j=i+i;j<maxn;j+=i){
   
            p[j]=true;
        }
    }
}
}
int main()
{
   
    int m,n,count=0;
    scanf("%d%d",&m,&n);

   Find_Prime(n);
   for(int i=m;i<=n;i++){
   
    printf("%d",prime[i-1]);
    count++;
    if(count%10!=0&&i<n)
    printf(" ");
        else printf("\n");
    }
        return 0;
}

B 1014 福尔摩斯的约会

#include <stdio.h>
#include<string.h>
int main()
{
   
    char str1[60],str2[60],str3[60],str4[60];
    scanf("%s",str1);
    scanf("%s",str2);
    scanf("%s",str3);
    scanf("%s",str4);
    int len1=strlen(str1);
    int len2=strlen(str2);
    int len3=strlen(str3);
    int len4=strlen(str4);
    if(len1>len2)
        len1=len2;
    int i;
    char day[7][5]={
   "MON","TUE","WED","THU","FRI","SAT","SUN"};
    for(i=0;i<len1;i++)
    {
   
         if(str1[i]==str2[i]&&str1[i]>='A'&&str1[i]<='G')
         {
   
            printf("%s ",day[str1[i]-'A']);
          break;
         }

    }
    for(i++;i<len1;i++)
    {
   
        if(str1[i]==str2[i]&&str1[i]>='A'&&str1[i]<='N')
        {
   
            printf("%02d:",str1[i]-'A'+10);
            break;
        }

        else if(str1[i]==str2[i]&&str1[i]>='0'&&str1[i]<='9')
        {
   
             printf("%02d:",str1[i]-'0');
             break;
        }

    }
    if(len3>len4)
        len3=len4;
    int j;
    for(j=0;j<len3;j++)
    {
   
        if(str3[j]==str4[j])
        {
   
            if((str3[j]>='A'&&str4[j]<='Z')||(str3[j]>='a'&&str3[j]<='z'))
         {
   
            printf("%02d",j);
            break;
          }
        }

       
    }
    return 0;
}

B 1015 德才论

#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct student
  {
   
      char id[10];
      int de,cai,sum;
      int flag;
  }stu[100010];
  bool cmp(student a,student b)
  {
   
      if(a.flag!=b.flag)
        return a.flag<b.flag;
      else if(a.sum!=b.sum)
        return a.sum>b.sum;
      else if(a.de!=b.de)
        return a.de>b.de;
      else
        return strcmp(a.id,b.id)<0;
  }
int main()
{
   
  int n,l,h,i;
  scanf("%d %d %d",&n,&l,&h);
  int pass=n;
  for(i=0;i<n;i++)
  {
   
      scanf("%s",stu[i].id);
      scanf("%d%d",&stu[i].de,&stu[i].cai);
      stu[i].sum=stu[i].de+stu[i].cai;
      if(stu[i].de<l||stu[i].cai<l)
      {
   
          stu[i].flag=5;
          pass--;
      }
      else if(stu[i].de>=h&&stu[i].cai>=h)
      {
   
          stu[i].flag=1;
      }
      else if(stu[i].de>=h&&stu[i].cai<h)
      {
   
         stu[i].flag=2;
      }
      else if(stu[i].de>=stu[i].cai)
      {
   
          stu[i].flag=3;
      }
      else
      {
   
          stu[i].flag=4;
      }
  }
  sort(stu,stu+n,cmp);
  printf("%d\n",pass);
  for(i=0;i<pass;i++)
  {
   
      printf("%s %d %d\n",stu[i].id,stu[i].de,stu[i].cai);
  }
    return 0;
}


B 1016 部分A+B(15)

#include<cstdio>
int main()
{
   
    long long a,b;
    int m,n;
    int i=0,j=0;
    scanf("%lld%d%lld%d",&a,&m,&b,&n);
    while(a!=0)
    {
   
        if(a%10==m)
            i=i*10+m;
        a=a/10;
    }
     while(b!=0)
    {
   
        if(b%10==n)
            j=j*10+n;
        b=b/10;
    }
    printf("%d",i+j);
    return 0;
}

A 1059 Prime Factors

这道题和数素数那题类似,都要得出素数表。可是输入这个数却测试结果失败的,求会的小伙伴,评论留言救下
在这里插入图片描述

#include <cstring>
#include<cstdio>
#include<algorithm>
#include<math.h>
#include <iostream>
using namespace std;
const int maxn=1000010;
int prime[maxn],num=0;
bool p[maxn]={
   0};
void Find_Prime(){
   
 for(int i=2;i<maxn;i++){
   
    if(p[i]==false){
   
        prime[num++]=i;
        for(int j=i+i;j<maxn;j+=i){
   
            p[j]=true;
        }
    }
}
}
struct factor{
   
 int x;
 int cnt;
 }fac[10];
int main()
{
   
    Find_Prime();
    int n,count=0;
    scanf("%d",&n);
    if(n==1) printf("1=1");
    else{
   
            printf("%d=",n);
            int sqr=(int)sqrt(1.0*n);

   for(int i=0;i<num&&prime[i]<=sqr;i++){
   
    if(n%prime[i]==0){
   
        fac[count].x=prime[i];
        fac[count].cnt=0;
        while(n%prime[i]==0){
   
            fac[count].cnt++;
            n/=prime[i];
        }
        count++;
    }
    if(n==1) break;
   }
   if(n!=1){
   
    fac[count].x=n;
    fac[count].cnt=1;
   }
   for(int i=0;i<count;i++){
   
    if(i>0) printf("*");
    printf("%d",fac[i].x);
    if(fac[i].cnt>1){
   
           printf("^%d",fac[i].cnt);
    }
   }
    }
        return 0;

}

B 1017 A除以B

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

struct bign
{
   
    int d[1010];
    int len;
    bign()
    {
   
        memset(d,0,sizeof(d));
        len=0;
    }
};

bign change(char str[])
{
   
    bign a;
    a.len=strlen(str);
    for(int i=0;i<a.len;i++)
    {
   
        a.d[i]=str[a.len-i-1]-'0';
    }
    return a;
}

bign divide(bign a,int b,int& r)
{
   
    bign c;
    c.len=a.len;
    for(int i=a.len-1;i>=0;i--)
    {
   
        r=r*10+a.d[i];
        if(r<b)
            c.d[i]=0;
        else
        {
   
            c.d[i]=r/b;
            r=r%b;
        }
    }
    while(c.len-1>=1&&c.d[c.len-1]==0)
    {
   
        c.len--;
    }
    return c;
}

void print(bign a)
{
   
    for(int i=a.len-1;i>=0;i--)
        printf("%d",a.d[i]);
}

int main()
{
   
    char str1[1010],str2[1010];
    int b,r=0;
    scanf("%s%d",str1,&b);
    bign a=change(str1);
    print(divide(a,b,r));
    printf(" %d",r);
    return 0;
}

B 1018 锤子剪刀布

#include<cstdio>
int change(char c)
{
   
    if(c=='B')
        return 0;
    if(c=='C')
        return 1;
    if(c=='J')
        return 2;
}

void tochange(int m)
{
   
    if(m==0)
        printf("B");
    if(m==1)
        printf("C");
    if(m==2)
        printf("J");
}
int main()
{
   
    int n,q,p;
    int v1=0,f1=0,p1=0,v2=0,f2=0,p2=0;
    char a,b;
    int maxa=0,maxb=0,m1=0,m2=0;
    int A[3]={
   0};
    int B[3]={
   0};
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
   
         getchar();//吸收回车符,否则输入数据后会闪退
        scanf("%c %c",&a,&b);
        p=change(a);
        q=change(b);
        if((p+1)%3==q)
        {
   
            v1++;
            f2++;
            A[p]++;
        }
          if((q+1)%3==p)
        {
   
            v2++;
            f1++;
            B[q]++;
        }
          if(p==q)
        {
   
            p1++;
            p2++;
        }
    }
    printf("%d %d %d\n",v1,p1,f1);
    printf("%d %d %d\n",v2,p2,f2);
    for(int j=0;j<3;j++)
    {
   
        if(A[j]>maxa)
        {
   
            m1=j;
            maxa=A[j];
        }

        if(B[j]>maxb)
        {
   
             m2=j;
             maxb=B[j];
        }
        
    }
    tochange(m1);
        printf(" ");
        tochange(m2);

}

B 1019 数字黑洞

这题需要注意:算式中数字和运算符号之间都有空格
不然,容易报格式错误哦!

#include <cstring>
#include<cstdio>
#include<algorithm>
#include <iostream>
using namespace std;
bool cmp(int a,int b){
   
    return a>b;
}
void to_array(int n,int num[]){
   
for(int i=0;i<4;i++){
   
    num[i]=n%10;
    n/=10;
}
}
int to_number(int num[]){
   
int sum=0;
for(int i=0;i<4;i++){
   
    sum=sum*10+num[i];
}
return sum;
}
int main()
{
   
    int n,MIN,MAX;
    scanf("%d",&n);
    int num[5];
    while(1){
   
        to_array(n,num);
        sort(num,num+4);
        MIN=to_number(num);
        sort(num,num+4,cmp);
        MAX=to_number(num);
        n=MAX-MIN;
        printf("%04d - %04d = %04d\n",MAX,MIN,n);
        if(n==0||n==6174)
            break;
    }
        return 0;
}


B 1020 月饼

这一篇代码在codebloks下运行没有问题,可是pat官网提交就说结果错误,希望有热心小伙伴指出错误之处。

#include<stdio.h>
#include<algorithm>
using namespace std;
struct mooncake{
   
double store;
double sell;
double price;
}cake[1010];
bool cmp(mooncake a,mooncake b){
   
return a.price>b.price;
}
int main(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值