PAT-乙级

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

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

1002 写出这个数

#include<stdio.h>
int main()
{
    char s[100];
    if(scanf("%s",s)){}
    int i=0,sum=0;
    while(s[i]!='\0')
    {
        sum+=(int)s[i++]-48;
    }
    if(sum==0)
    {
        printf("ling");
    }
    else
    {
       int a[10],j=0;
        while(sum!=0)
        {
           a[j++]=sum%10;
           sum/=10;
       }
       for(int t=j-1;t>=0;t--)
       {
           if(a[t]==1)
           printf("yi");
           if(a[t]==2)
           printf("er");
           if(a[t]==3)
           printf("san");
           if(a[t]==4)
            printf("si");
           if(a[t]==5)
           printf("wu");
           if(a[t]==6)
           printf("liu");
           if(a[t]==7)
           printf("qi");
           if(a[t]==8)
           printf("ba");
           if(a[t]==9)
           printf("jiu");
           if(a[t]==0)
           printf("ling");
        if(t!=0)
        {
            printf(" ");
        }
    }
    }
    return 0;
}

1003 我要通过!

题目意思:

  • P和T有且只能有一个
  • 设p前A的个数为t1,P、T中间A的个数为t2,T后A的个数为t3,须满足t1*t2=t3
#include<stdio.h>
int main()
{
    int n;
    char a[10][100];
    scanf("%d",&n);
    //输入字符串
    for(int i=0;i<n;i++)
    {
        scanf("%s",a[i]);
        getchar();
    }
    //遍历字符串
    for(int j=0;j<n;j++)
    {
        int t=0,flag=0,t1=0,t2=0,t3=0,p1=0,p2=0;
        while(a[j][t]!='\0')
        {
             //判断是否有不是PAT的字符
             if(a[j][t]!='P'&&a[j][t]!='A'&&a[j][t]!='T')
               {
                   flag++;
               }
             //A的所有个数
             if(a[j][t]=='A')
             {
                 t1++;
             }
            //求P的个数
             if(a[j][t]=='P')
                p1++;
             //求T的个数
             if(a[j][t]=='T')
                 p2++;
               t++;
        }
        t=0;
        //求P前A的个数
        while(a[j][t]!='P')
        {
            if(a[j][t]=='A')
            t2++;
            t++;
        }
        t=0;
       //求T前A的个数
        while(a[j][t]!='T')
        {
            if(a[j][t]=='A')
            t3++;
            t++;
        }
        if(flag==0&&(t3-t2)!=0&&t2*(t3-t2)==(t1-t3)&&p1==1&&p2==1)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
        
    }
}

1004 成绩排名

这道题一开始总提示部分正确,也是看了别人的博客才知道把n的范围扩大到10000就正确了

#include<stdio.h>
int main()
{
    char name[10000][30],sno[10000][30];
    int n,score[10000],max,min,a=0,b=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s%s%d",name[i],sno[i],&score[i]);
    }
    max=score[0];
    min=score[0];
    for(int i=0;i<n;i++)
    {
        if(max<score[i])
        {
           max=score[i];a=i;
        }
        if(min>score[i])
        {
           min=score[i];b=i;
        }
    }
    printf("%s %s\n",name[a],sno[a]);
    printf("%s %s\n",name[b],sno[b]);
    return 0;
}

1005 继续(3n+1)猜想

来自菜鸟的暴力解决法

思路:

  • 获取数列中每个数的猜想数,存入二维数组
  • 数列num[i]与每个数的猜想数相比较,如果相等则令num[i]=-1,相当于删除此数
  • 找出数列num中所有不是-1的数,即关键数,并存入一个数组
  • 冒泡排序
#include<stdio.h>
int main()
{
    int k,num[100],_num[100][100];
    scanf("%d",&k);
    //输入数列
    for(int i=0;i<k;i++)
    {
        scanf("%d",&num[i]);
    }
    //找出每个数的猜想数
    int t;
    for(int i=0;i<k;i++)
    {
        int j=0;
        t=num[i];
        while(t>1)
        {
            if(t%2==0)
            {
                t/=2;
                _num[i][j++]=t;
            }
            else
            {
                t=(3*t+1)/2;
                _num[i][j++]=t;
            }
        }
    }
    //标记非关键数
    for(int i=0;i<k;i++)
    {
        int t=0;
        while(_num[i][t]!=1)
        {
            for(int j=0;j<k;j++)
            {
                if(num[j]==_num[i][t])
                    num[j]=-1;
            }
            t++;
        }
    }
    //提取关键数
    int sum=0,new[100],p=0;
    for(int i=0;i<k;i++)
    {
        if(num[i]!=-1)
           new[p++]=num[i];
    }
    sum=p;
    //冒泡排序
    int temp,flag=0;
    for(int i=0;i<sum;i++)
    {
        flag=0;
        for(int j=sum-1;j>=i;j--)
        {
            if(new[j]>new[i])
            {
                temp=new[i];
                new[i]=new[j];
                new[j]=temp;
                flag=1;
            }
        }
        if(flag==0)
           break;
    }
    //输出
    for(int i=0;i<sum;i++)
    {
        printf("%d",new[i]);
        if(i!=sum-1)
           printf(" ");
    }
}

1006 换个格式输出整数

#include<stdio.h>
int main()
{
    int n,a[3];
    scanf("%d",&n);
    for(int i=0;i<3;i++)
    {
         a[i]=n%10;
         n/=10;
    }
    for(int i=a[2];i>0;i--)
    {
        printf("B");
    }
    for(int i=a[1];i>0;i--)
    {
        printf("S");
    }
    for(int i=1;i<=a[0];i++)
    {
        printf("%d",i);
    }
}

1007 素数对猜想

#include<stdio.h>
#include<math.h>
int main()
{
    int n,a[10000],j=0,sum1=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int sum=0;
        for(int t=2;t<=sqrt(i);t++)
        {
            if(i%t==0)
            {
                sum=1;
            }
        }
        if(sum==0)
        {
            a[j++]=i;
            if(a[j-1]-a[j-2]==2)
               sum1++;
        }
    }
    printf("%d",sum1);
}

1008 数组元素循环右移问题

解题关键是M可以大于N,因此应m=m%n;

//解法一:数组元素位置不变,只是打印位置的改变
#include<stdio.h>
int main()
{
    int n,m,a[1000],t;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    m=m%n;
    if(n==m)
    {
        for(int i=0;i<n;i++)
        {
            printf("%d",a[i]);
            if(i!=n-1)
            {
                printf(" ");
            }
        }
    }
    else
    {
        t=n-m;
        for(int i=t;i<n;i++)
        {
            printf("%d ",a[i]);
        }
        for(int i=0;i<t;i++)
        {
            printf("%d",a[i]);
            if(i!=t-1)
            {
                printf(" ");
            }
        }
    } 
}
//解法二:数组元素位置改变(我觉得这种方法更符合题意)
#include<stdio.h>
int main()
{
    int n,m,a[108],temp,t;
    scanf("%d%d",&n,&m);
    m=m%n;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(n==m)
    {
        for(int i=n-1;i>=0;i--)
        {
            printf("%d",a[i]);
            if(i!=0)
            {
                printf(" ");
            }
        }
    }
    else
    {
    t=n-m;
    for(int  i=0;i<m;i++)
    {
        temp=a[t++];
        for(int j=t-1;j>=i;j--)
        {
            a[j]=a[j-1];
        }
        a[i]=temp;
    }
    for(int i=0;i<n;i++)
    {
        printf("%d",a[i]);
        if(i!=n-1)
        {
            printf(" ");
        }
    }
    }
}
//解法三:(从别人博客偷来的,博客名:黑白之间还有灰【https://me.csdn.net/qq_41525492】)
#include<stdio.h>
int main()
{
    int n,m,a[1000],t;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    m=m%n;
    for(int i=0;i<n;i++)
    {
        a[n+i]=a[i];
    } 
   for(int i=0;i<n;i++)
   {
       a[i]=a[n-m+i];
   }
    for(int i=0;i<n;i++)
    {
        printf("%d",a[i]);
        if(i!=n-1)
        {
            printf(" ");
        }
    }
   
}

1009 说反话

#include<stdio.h>
int main()
{
    char str[80][20],ch;
    int i,j;
    for(i=0;;i++)
    {
        scanf("%s",str[i]);
        if((ch=getchar())=='\n')
           break;
    }
    for(j=i;j>=0;j--)
    {
        printf("%s",str[j]);
        if(j!=0)
           printf(" ");
    }
    return 0;
}

1010 一元多项式求导

#include<stdio.h>
int main()
{
    int a[1000],i,sum=0;
    char ch;
    for(i=0;;i++)
    {
        scanf("%d",&a[i]);
        if((ch=getchar())=='\n')
        break;
    }
    //求需要输出的元素个数sum
    if(a[i]==0)
    sum=i-2;
    else
    sum=i;
    //特殊情况的输出:(0 0)以及(x 0)
    if((i==0&&a[0]==0))
    printf("0 0");
    if((i==1&&a[0]==0&&a[1]==0)||(i==1&&a[i]==0))
    printf("0 0");
    //一般情况的输出
    else
    {
        for(int j=0;j<sum;j+=2)
        {  
               printf("%d %d",a[j]*a[j+1],a[j+1]-1);
                if(j!=sum-1)
                printf(" ");
        }
    }
}

1011 A+B 和 C

#include<stdio.h>
int main()
{
    long a[100],b[100],c[100];
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%ld%ld%ld",&a[i],&b[i],&c[i]);
    }
    for(int i=0;i<n;i++)
    {
        if(a[i]+b[i]>c[i])
        {
            printf("Case #%d: true\n",i+1);
        }
        else
        printf("Case #%d: false\n",i+1);
    }
}

1013 数素数

注意点:

  • 1不是素数
  • 题意是求素数Pm 和素数Pn之间的素数,所以要先求出Pm和Pn
#include<stdio.h>
#include<math.h>
int main()
{
    int m,n,a=0,b,c = 0,flag=0,a_flag=0;
    scanf("%d%d",&m,&n);
   //求素数Pm 和Pn
    for(int i=2;;i++)
    {
        int sum=0;
        for(int t=2;t<=sqrt(i);t++)
        {
            if(i%t==0)
                sum=1;
        }
        if(sum==0)
            flag++; //标记是第几个素数
        if(a_flag!=1)  //防止打印多个a
        { 
            if(flag==m)
            {
                a_flag=1;
                a=i;
            }
        }
        if(flag==n)
        {
            b=i;
            break;
        }
    }
    //求素数
    for(int i=a;i<=b;i++)
    {
        int sum=0;
        for(int t=2;t<=sqrt(i);t++)
        {
            if(i%t==0)
                sum++;
        }
        if(sum==0)
        {
            c++;
            printf("%d",i);
            if(c%10==0)  //满10个输出回车
            {
                printf("\n");
                continue;
            }
            if(i!=b)  //最后一个素数后没有空格
                printf(" ");
        }
    }
    return 0;
}

1012 数字分类

测试点7未通过

#include<stdio.h>
int main()
{
    int a[1000],a1=0,a2=0,a3=0,a5=0,sum=0,flag=0,j1=0,a2_flag=0;
    double a4=0;
    scanf("%d",&sum);
    for(int i=0;i<sum;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<sum;i++)
    {
        if(a[i]%5==0)
        {
            if(a[i]%2==0)
            {
                a1+=a[i];
            }
        }

        if(a[i]%5==1)
        {
            flag++;
            if(flag%2!=0)
            {
               a2+=a[i];a2_flag=1;
            }
            else
            {
                a2-=a[i];a2_flag=1;
            }
        }

        if(a[i]%5==2)
        {
            a3++;
        }

        if(a[i]%5==3)
        {
            j1++;
            a4+=a[i];
        }

        if(a[i]%5==4)
        {
            if(a5<=i)
             a5=a[i];
        }
    }
    if(a1!=0)
    printf("%d ",a1);
    else
    printf("N ");
    if(a2_flag!=0)
    printf("%d ",a2);
    else
    printf("N ");
    if(a3!=0)
    printf("%d ",a3);
    else
    printf("N ");
    if(a4!=0)
    printf("%.1f ",a4/j1);
    else
    printf("N ");
    if(a5!=0)
    printf("%d",a5);
    else
    printf("N");
}

1014 福尔摩斯的约会

#include<stdio.h>
#include<string.h>
char days[7][10]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
int main()
{
    int sign=0;
    char message[4][61];
    long lengthFirst=0;
    long lengthSecond=0;
    for(int i=0;i<4;i++)
    {
        scanf("%s",message[i]);
    }
    lengthFirst=strlen(message[0]);
    if(strlen(message[1])<strlen(message[0])){
        lengthFirst=strlen(message[1]);
    }
    lengthSecond=strlen(message[2]);
    if(strlen(message[3])<strlen(message[2])){
        lengthSecond=strlen(message[3]);
    }

    for(int i=0;i<lengthFirst;i++)
    {
        if(message[0][i]==message[1][i]){
            if(sign==0){
                if(message[0][i]>='A'&&message[0][i]<='G')
                {
                    printf("%s ",days[message[0][i]-'A']);
                    sign++;
                }
            }
            else if(sign==1){
                if(message[0][i]>='0'&&message[0][i]<='9'){
                    printf("%02d",message[0][i]-48);
                    break;
                }
                else if(message[0][i]>='A'&&message[0][i]<='N')
                {
                    printf("%02d",message[0][i]-'A'+10);
                    break;
                }
            }
        }
    }
    for(int i=0;i<lengthSecond;i++)
    {
        if(message[2][i]==message[3][i]){
            if(message[2][i]>='A'&&message[2][i]<='z'){
                printf(":%02d\n",i);
                break;
            }
        }
    }
    return 0;
}

1016 部分A+B

#include<stdio.h>
int main()
{
    int Da,Db,Pa=0,Pb=0,i=0,j=0;;
    char A[100],B[100];
    scanf("%s%d%s%d",A,&Da,B,&Db);
    while(A[i]!='\0')
    {
        if(((int)A[i]-48)==Da)
        {
            Pa=Pa*10+((int)A[i]-48);
        }
        i++;
    }

    while(B[j]!=0)
    {
        if(((int)B[j]-48)==Db)
        {
            Pb=Pb*10+((int)B[j]-48);
        }
        j++;
    }

    printf("%d",Pa+Pb);
}

1017 A除以B

#include<stdio.h>
#include<string.h>

int main()
{
    int B,i=0,j=0,sum,num=0,flag=0;
    char A[1000];
    scanf("%s%d",A,&B);
    sum=strlen(A);
    for(i=0;i<sum;i++)
    {
        num=num*10+(int)A[i]-48;
        if(num>=B)
        {
            printf("%d",num/B);
            flag=1;
        }
        else if(i>0&&num<B) //i>0是因为去掉第一个数字大于B的情况
        {
             printf("0");
        }
        num=num%B;
    }
    if(flag==0)//当A小于B的时候
    printf("0");
    printf(" %d",num);
}

1018 锤子剪刀布

#include<stdio.h>
int main()
{
    int N,a11=0,a12=0,a13=0,a2=0,a3=0,b11=0,b12=0,b13=0,b2=0,b3=0;
    scanf("%d",&N);
    getchar();
    char A[100000],B[100000];
    for(int i=0;i<N;i++)
    {
        scanf("%c %c",&A[i],&B[i]);
        getchar();
    }
    for(int i=0;i<N;i++)
    {
        if(A[i]=='C'&&B[i]=='J')
        {
            a11++;b3++;

        }
        else if(A[i]=='B'&&B[i]=='C')
        {
            a12++;b3++;

        }
        else if(A[i]=='J'&&B[i]=='B')
        {
            a13++;b3++;
        }
        else if(A[i]==B[i])
        {
            a2++;b2++;
        }
        else if(A[i]=='J'&&B[i]=='C')
        {
            a3++;b11++;
        }
        else if(A[i]=='B'&&B[i]=='J')
        {
            a3++;b12++;
        }
        else  if(A[i]=='C'&&B[i]=='B')
        {
            a3++;b13++;
        }
    }

    printf("%d %d %d\n%d %d %d\n",a11+a12+a13,a2,a3,b11+b12+b13,b2,b3);

    if(a11>=a13&&a11>a12)
    printf("C ");
    else if(a13>a11&&a13>a12)
    printf("J ");
    else
    printf("B ");

    if(b11>=b12&&b11>b13)
    printf("C");
    else if(b12>b11&&b12>b13)
    printf("J");
    else
    printf("B");
    return 0;
}

1019 数字黑洞

1、0000的输出

2、6174的输出(测试点6)

#include<stdio.h>
int main()
{
    int N,n[4],t1=0,t2=0,temp=0;
    scanf("%d",&N);
    if(N==0)
    {
        printf("0000 - 0000 = 0000\n");
    }
    if(N==6174)
    {
        printf("7641 - 1467 = 6174\n");
    }
    while(N!=6174&&N!=0)
   {
       t1=0;t2=0;
      for(int i=3;i>=0;i--)
      {
          n[i]=N%10;
          N/=10;
      }

      for(int i=0;i<3;i++)
      {
          for(int j=0;j<3-i;j++)
          {
              if(n[j]<n[j+1])
              {
                 temp=n[j];n[j]=n[j+1];n[j+1]=temp;
              }
          }
      }

      for(int i=0,j=3;i<4;i++)
      {
           t1=t1*10+n[i];
           t2=t2*10+n[j--];
      }
      printf("%04d - %04d = %04d\n",t1,t2,t1-t2);
      N=t1-t2;
   }
    
   return 0;
}

1021 个位数统计

#include<stdio.h>

int main()
{
    int sum=0,num[100]={0};
    char n[1000];

    scanf("%s",n);
    
    while(n[sum]!='\0')
    {
        sum++;
    }

    int kd;
    for(int i=0;i<sum;i++)
    {
        kd=(int)n[i]-48;
        num[kd]++;
    }

    for(int i=0;i<10;i++)
    {   
        if(num[i]!=0)
        printf("%d:%d\n",i,num[i]);
    }
    return 0;

}

1022 D进制的A+B

#include<stdio.h>
int main()
{
    long A,B,sum;
    int C,a[100],i=0,s;
    scanf("%ld%ld%d",&A,&B,&C);
    sum=A+B;
    if(sum==0)
    printf("0");
    while(sum!=0)
    {
        a[i++]=sum%C;
        sum/=C;
        s=i;
    }
    for(int i=s-1;i>=0;i--)
    {
        printf("%d",a[i]);
    }
    return 0;   
}

1023 组个最小数

#include<stdio.h>
int main()
{
    int a[10],b[100],sum=0;
    for(int i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    
    for(int i=1,j=1;i<10;i++)
    {
       if(a[i]!=0)
       {
           for(int t=0;t<a[i];t++)
           {
               b[j++]=i;
               sum=j;
           }
       }
       b[0]=a[0];
    }


    if(b[0]==0)
    {
        for(int i=1;i<sum;i++)
        {
            printf("%d",b[i]);
        }
    }
    else
    {
        printf("%d",b[1]);
        for(int i=0;i<b[0];i++)
        {
            printf("0");
        }
        for(int j=2;j<sum;j++)
        {
            printf("%d",b[j]);
        }
    }
    return 0;
}

1015 德才论(未通过)

答案是错的,回看代码,就像写了一堆破烂,日后修改

#include<stdio.h>

typedef struct
{
    long sno;
    int de;
    int cai;
    int sum;
    int flag;
}student;

void paixu(student *p,int *a)
{
    int temp;long temp1;
    for(int i=0;i<*a;i++)
    {
        for(int j=0;j<*a-i-1;j++)
        {
            if(p[j].sum==p[j+1].sum)
            {
                if(p[j].de<p[j+1].de)
                {
                    temp=p[j].sum;p[j].sum=p[j+1].sum;p[j+1].sum=temp;
                    temp=p[j].de;p[j].de=p[j+1].de;p[j+1].de=temp;
                    
                    temp=p[j].cai;p[j].cai=p[j+1].cai;p[j+1].cai=temp;
                    
                    temp1=p[j].sno;p[j].sno=p[j+1].sno;p[j+1].sno=temp1;
                    
                }
                if(p[j].de==p[j+1].de)
                {
                    if(p[j].sno<p[j+1].sno)
                    {
                        temp=p[j].sum;p[j].sum=p[j+1].sum;p[j+1].sum=temp;
                        temp=p[j].de;p[j].de=p[j+1].de;p[j+1].de=temp;
                        
                        temp=p[j].cai;p[j].cai=p[j+1].cai;p[j+1].cai=temp;
                        
                        temp1=p[j].sno;p[j].sno=p[j+1].sno;p[j+1].sno=temp1;                    }
                }
            }
            if(p[j].sum<p[j+1].sum)
            {
                temp=p[j].sum;p[j].sum=p[j+1].sum;p[j+1].sum=temp;
                temp=p[j].de;p[j].de=p[j+1].de;p[j+1].de=temp;
                
                temp=p[j].cai;p[j].cai=p[j+1].cai;p[j+1].cai=temp;
                
                temp1=p[j].sno;p[j].sno=p[j+1].sno;p[j+1].sno=temp1;
                
            }
        }
    }
}

int main()
{
    printf("dksjf\n");
    int N,L,H;
    scanf("%d%d%d",&N,&L,&H);
    student stu[N],one[N],two[N],three[N],four[N];
    int t4=0,t1=0,t2=0,t3=0;
    for(int i=0;i<N;i++)
    {
        scanf("%ld%d%d",&stu[i].sno,&stu[i].de,&stu[i].cai);
    }
    

    for(int i=0;i<N;i++)
    {
        stu[i].sum=stu[i].de+stu[i].cai;
        if(stu[i].de>=H&&stu[i].cai>=H)
        {
            one[t1].sum=stu[i].sum;
            one[t1].sno=stu[i].sno;one[t1].de=stu[i].de;one[t1].cai=stu[i].cai;
            t1++;
        }
        else if(stu[i].de>=L&&stu[i].de<H&&stu[i].cai>=L&&stu[i].cai<H&&stu[i].de>=stu[i].cai)
        {
            three[t3].sum=stu[i].sum;
            three[t3].sno=stu[i].sno;three[t3].de=stu[i].de;three[t3].cai=stu[i].cai;
            t3++;
        }
        else if(stu[i].de>=H&&stu[i].cai>=L&&stu[i].cai<H)
        {
            two[t2].sum=stu[i].sum;
            two[t2].sno=stu[i].sno;two[t2].de=stu[i].de;two[t2].cai=stu[i].cai;
            t2++;
        }
        else if(stu[i].de>=L&&stu[i].cai>=L&&stu[i].de<H&&stu[i].de<stu[i].cai)
        {
            four[t4].sum=stu[i].sum;
            four[t4].sno=stu[i].sno;four[t4].de=stu[i].de;four[t4].cai=stu[i].cai;
            t4++;
        }
    }
    
    paixu(one,&t1);
    paixu(two,&t2);
    paixu(three,&t3);
    paixu(four,&t4);

    printf("%d\n",t1+t2+t3+t4);

    if(t1!=0)
    {
    for(int j=0;j<t1;j++)
    {
        printf("%ld %d %d\n",one[j].sno,one[j].de,one[j].cai);
    }
    }
 
    if(t2!=0)
    {
    for(int i=0;i<t2;i++)
    {
        
            printf("%ld %d %d\n",two[i].sno,two[i].de,two[i].cai);
    }
    }
 
    if(t3!=0)
    {
    for(int i=0;i<t3;i++)
    {
        
            printf("%ld %d %d\n",three[i].sno,three[i].de,three[i].cai);
    }
    }
    if(t4!=0)
    {
    for(int i=0;i<t4;i++)
    {
        
        printf("%ld %d %d\n",four[i].sno,four[i].de,four[i].cai);
    }
    }
    return 0;
}


1020 月饼

测试点2:库存量不是整数的情况

#include<stdio.h>
int main()
{
    int N,D;
    double b[1000],temp1,a[1000][2],temp[1][3];
    scanf("%d%d",&N,&D);
    
    for(int i=0;i<N;i++)
    {
        scanf("%lf",&a[i][0]);
    }
    for(int i=0;i<N;i++)
    {
        scanf("%lf",&a[i][1]);
    }
    //求单价
    for(int i=0;i<N;i++)
    {
        b[i]=a[i][1]/a[1][0];
    }
    //按单价排序
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N-i-1;j++)
        {
            if(b[j]<b[j+1])
            {
                temp1=b[j];b[j]=b[j+1];b[j+1]=temp1;
                for(int t=0;t<2;t++)
                {
                    
                    temp[0][t]=a[j][t];
                    a[j][t]=a[j+1][t];
                    a[j+1][t]=temp[0][t];
                }
            }
        }
    }
    
    int t=0,D1;
    double sum=0,num1=D;
    D1=D;
    for(int i=0;i<N;i++)
    {
        t++;
        D1-=a[i][0];
        if(D1<=0)
        {
            break;
        }
    }
    for(int i=0;i<t;i++)
    {
        if(i!=t-1)
        {
            sum+=a[i][1];
        }
        else
        {
           if(num1<=a[i][0])
            sum+=num1*b[i];
            else
            sum+=a[i][1];
        }
        num1-=a[i][0];
    }
    printf("%.2lf",sum);
    return 0;
}

1024 科学计数法

百般调试下,终于做对了,代码比较长,懒得改了

推荐测试点

  • -1.2E+9999(测试点6)
  • -1000.0E05(测试点3,5)
  • +0.1E-1(测试点4)
#include<stdio.h>
int main()
{
    char num[10000],new_num[10000];
    scanf("%s",num);
    int dian=0,jian=0,E=0,i=0,ling=0;
    while(num[i]!='\0')
    {
        if(num[i]=='.')
        dian=i;
        if(num[i]=='E')
        E=i;
        if(num[i]=='-')
        jian=i;
        i++;
    }
    
    int j=E+1,total=0;
    while(num[j]!='\0')
    {
        if(num[j]!='-'&&num[j]!='+')
        total=total*10+(int)num[j]-48;
        j++;
    }

    if(jian>0)
    {
           if(dian-total>1)
           {
               for(int i=0;i<=dian-total;i++)
               {
                   if(num[i]!='+')
                   printf("%c",num[i]);
               }
               if((dian+total)+1!=E)
               printf(".");
               for(int i=dian-total+1;i<E;i++)
               {
                   if(num[i]!='.')
                   printf("%c",num[i]);
               }
           } 
           else
           {
               if(num[0]=='-')
               printf("-");
               printf("0.");
               for(int i=0;i<total-dian+1;i++)
               {
                   printf("0");
               }
               for(int i=1;i<E;i++)
               {
                   if(num[i]!=1&&num[i]!='.')
                   {
                       printf("%c",num[i]);
                   }
               }
           }  
   
    }
    else
    {
        int j=0,sum=0;
        if(dian+total+1<E)
        {
            for(int i=0;i<=dian+total;i++)
            {
               
                if(num[i]!='+'&&num[i]!='.'&&num[i]!='-')
               new_num[j++]=num[i];
             
        
            }
            for(int i=0;i<j;i++)
            {
                sum=sum*10+(int)new_num[i]-48;
            }
            if(num[0]=='-')
            printf("-");
            printf("%d",sum);
            if((dian+total)!=E)
            printf(".");
            for(int i=dian+total+1;i<E;i++)
            {
                printf("%c",num[i]);
            }
        }
        else
        {
            for(int i=0;i<E;i++)
            {
                for(int i=1;i<E;i++)
                {
                    if(num[i]=='0')
                    {
                        ling++;
                    }
                }
                if(ling==dian-1)
                {
                if(num[i]!='+'&&num[i]!='.'&&num[i]!='0')
                printf("%c",num[i]);
                }
                else
                {
                    if(num[i]!='+'&&num[i]!='.')
                    printf("%c",num[i]);
                }
            }
            for(int i=0;i<dian+total-E+1;i++)
            {
                printf("0");
            }
        }
    }
    return 0;
}

1027 打印沙漏

#include<stdio.h>
int main()
{
    int N;
    char ch;
    scanf("%d %c",&N,&ch);
   //计算图形折叠后的高度t
    int sum=0,t=0;;
    for(int i=1;;i++)
    {
        sum+=4*i-2;
        if(sum-1>N)
        {
            t=i-1;break;
        }
        if(sum-1==N)
        {
            t=i;break;
        }
    }
    //统计图形所用符号个数
    sum=0;
    for(int i=1;i<=t;i++)
    {
        sum+=4*i-2;
    }
   //打印上半部分
    for(int i=t;i>=2;i--)
    {
        for(int j=t;j>i;j--)
        {
            printf(" ");
        }
        for(int h=0;h<2*i-1;h++)
        {
            printf("%c",ch);
        }
        printf("\n");
    }
    //打印下半部分
    for(int i=1;i<=t;i++)
    {
        for(int j=t;j>i;j--)
        {
            printf(" ");
        }
        for(int h=0;h<2*i-1;h++)
        {
            printf("%c",ch);
        }
        printf("\n");
    }
     printf("%d\n",N-(sum-1));
    return 0;
    
}

1028 人口普查

1、当合理个数为0时,不输出姓名(测试点3)

1、结构题数组的长度改为100010就不会出现段错误(测试点4)

#include<stdio.h>
#include<string.h>

typedef struct
{
    char name[100];
    int year;
    int month;
    int day;
    int age;
}PERSON;

int main()
{ 
    int N,sum=0,temp,min=0,max=0;
    PERSON stu[100010],stu1[100010];
    scanf("%d",&N);
    
    for(int i=0;i<N;i++)
    {
        scanf("%s%d/%d/%d",stu[i].name,&stu[i].year,&stu[i].month,&stu[i].day);
    }
    
    //找出合理生日
    for(int i=0;i<N;i++)
    {
        
        stu[i].age=(2014-stu[i].year-1)*372+(12-stu[i].month-1)*31+(31-stu[i].day)+285;
        
        if(stu[i].age>=0&&stu[i].age<=74400)
        {
            
            strcpy(stu1[sum].name,stu[i].name);
            stu1[sum].year=stu[i].year;
            stu1[sum].month=stu[i].month;
            stu1[sum].day=stu[i].day;
            stu1[sum].age=stu[i].age;
            if(stu1[min].age>stu1[sum].age)//找年龄最小的
                min=sum;
            if(stu1[max].age<stu1[sum].age)//找年龄最大的
                max=sum;
            sum++;
        }
    }
    if(sum==0)
        printf("0");
    else
    printf("\n%d %s %s",sum,stu1[max].name,stu1[min].name);
    return 0;
}

1029 旧键盘

#include<stdio.h>
int main()
{
    char str1[100],str2[100],str3[100],str4[100];
    scanf("%s",str1);
    scanf("%s",str2);
   //标记未坏的键盘
    int i=0,j=0;
    while(str2[i]!='\0')
    {
        j=0;
        while(str1[j]!=0)
        {
            if(str2[i]==str1[j]||str2[i]==str1[j]-32)
            {
                str1[j]='*';
            }
            j++;
        }
        i++;
    }
   //提取好键盘
    int t=0;i=0;
    while(str1[i]!='\0')
    {
        if(str1[i]!='*')
        {
            if(str1[i]>='a'&&str1[i]<='z')
            {
                str3[t++]=str1[i]-32;
            }
            else
            str3[t++]=str1[i];
            
        }
        i++;
    }
    //去除重复
    int s=0,flag=0;
    for(int i=0;i<t;i++)
    {
        flag=0;
        for(int j=0;j<s;j++)
        {
            if(str3[i]==str4[j])
            flag=1;
        }
        if(flag==0)
        str4[s++]=str3[i];
    }
    puts(str4);
    return 0;
}

1032 挖掘机技术哪家强

方法1:最后一个测试点运行超时

#include<stdio.h>
int main()
{
    int N,n[100000][2],s[10000][2]={0},t2=0,flag=0,max[1][2];
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d%d",&n[i][0],&n[i][1]);
    }
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<t2;j++)
        {
            if(n[i][0]==s[j][0])
            {
                s[j][1]+=n[i][1];
               
                
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            s[t2][0]=n[i][0];
            s[t2][1]=n[i][1];
            t2++;
        }
    }
    max[0][1]=0;
    for(int i=0;i<t2;i++)
    {
        if(max[0][1]<s[i][1])
        {
            max[0][0]=s[i][0];
            max[0][1]=s[i][1];
        }
    }
  
    printf("%d %d",max[0][0],max[0][1]);
}

改进:

测试点2:只有一组数据的时候

测试点3:考察数组长度和算法效率

#include<stdio.h>
int main()
{
    int N,n[100020][2],s[100020],max[1][2];
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d%d",&n[i][0],&n[i][1]);
        s[n[i][0]]+=n[i][1];
    }
    max[0][1]=-1;
        for(int j=0;j<N+1;j++)
        {
               if(max[0][1]<s[j])
                {
                     max[0][0]=j;
                     max[0][1]=s[j];
                }
        }
    printf("%d %d",max[0][0],max[0][1]);
    
    return 0;
}

1036 跟奥巴马一起编程

#include<stdio.h>
int main()
{
    double a;
    char c;
    scanf("%lf %c",&a,&c);
    for(int i=0;i<a;i++)
    {
        printf("%c",c);
    }
    printf("\n");
    int m=(int)(a/2+0.5);
    for(int i=0;i<m-2;i++)
    {
        printf("%c",c);
        for(int j=0;j<a-2;j++)
        {
            printf(" ");
        }
        printf("%c\n",c);
    }
    for(int i=0;i<a;i++)
    {
        printf("%c",c);
    }
    return 0;
}

1033 旧键盘打字(4未通过)

#include<stdio.h>
int main()
{
    char bad[130],ch;
    gets(bad);
    while((ch=getchar())!='\n')
    {
        int j=0,flag=0;
        while(bad[j]!='\0')
        {
            if((ch==bad[j]||ch==bad[j]+32)||(bad[j]=='+'&&ch>='A'&&ch<='Z'))
            {
                flag=1;
            }
            j++;
        }
        if(flag!=1)
        {
            putchar(ch);
        } 
    }
    printf("\n");
    return 0;
}

1034 有理数四则运算

#include<stdio.h>
#include<stdlib.h>
/*求最大公约数*/
long max(long long a,long long b)
{
    if(b==0)
       return a;
    return max(b,a%b);
}

/*输出格式*/
long show(long long a,long long b)
{
    if(b==0)
    {
       printf("Inf");
       return 0;
    }
    else if(b==1)
    {
        if(a<0)
        printf("(%lld)",a);
        else 
         printf("%lld",a);
       return 0;
    }

    long k=a/b;
    if(k!=0)
       a%=b;
    long _max;
    _max=max(a,b);
    a/=_max;
    b/=_max;
    if(b<0)
    {
        a=-a;b=-b;
    }

    if(a==0)
    {
        if(k<0)
           printf("(%lld)",k);
        else
           printf("%lld",k);
        return 0;
    }
    if(k==0)
    {
        if(a<0)
          printf("(%lld/%lld)",a,b);
        else
          printf("%lld/%lld",a,b);
    }
    else if(k<0)
    {
            printf("(%lld %lld/%lld)",k,-a,b);  
    }
    else
    {
        printf("%lld %lld/%lld",k,a,b);
    }
    return 0;
}

int main()
{
   long long a1,b1,a2,b2;
    scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);  

    show(a1,b1);printf(" + ");show(a2,b2);printf(" = ");show(a1*b2+b1*a2,b1*b2);printf("\n");
    show(a1,b1);printf(" - ");show(a2,b2);printf(" = ");show(a1*b2-b1*a2,b1*b2);printf("\n");
    show(a1,b1);printf(" * ");show(a2,b2);printf(" = ");show(a1*a2,b1*b2);printf("\n");
    show(a1,b1);printf(" / ");show(a2,b2);printf(" = ");show(a1*b2,a2*b1);printf("\n");
    return 0;
}

1037 在霍格沃茨找零钱

#include<stdio.h>

int main()

{

​    long long a,a1,sum1=0,sum2=0,b,c,b1,c1,sum3=0;

​    scanf("%lld.%lld.%lld %lld.%lld.%lld",&a,&b,&c,&a1,&b1,&c1);

​    

​    sum1=a*17*29+b*29+c;

​    sum2=a1*17*29+b1*29+c1;

​    sum3=sum2-sum1;

​    if(sum2>=sum1)

​    printf("%lld.%lld.%lld",sum3/(17*29),(sum3%(17*29))/29,sum3%29);

​    else

​    {

​        sum3=sum1-sum2;

​        printf("-%lld.%lld.%lld",sum3/(17*29),(sum3%(17*29))/29,sum3%29);

​    }

​    return 0;

}

1038 统计同成绩学生

#include<stdio.h>
int main()
{
    int N,K,n[100020],k[1000],n1[101]={0};
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d",&n[i]);
        n1[n[i]]++;
    }
    scanf("%d",&K);
    for(int i=0;i<K;i++)
    {
        scanf("%d",&k[i]);
    }

    for(int i=0;i<K;i++)
    {
         for(int j=0;j<=100;j++)
         {
             if(j==k[i])
             {
                 printf("%d",n1[j]);
                 if(i!=K-1)
                 printf(" ");
             }
         }
    }
    return 0;

}

1039 到底买不买

#include<stdio.h>
int main()
{
    char s1[1010],s2[1010];
    scanf("%s%s",s1,s2);

    int i=0,j=0;
    while(s1[i]!='\0')
    {
        j=0;
        while(s2[j]!='\0')
        {
            if(s1[i]==s2[j])
            {
                s1[i]='*';
                s2[j]='*';
            }
            j++;
        }
        i++;
    } 

    int t1=0,t2=0;
    i=0;j=0;
    while(s2[i]!='\0')
    {
        if(s2[i]!='*')
        {
            t1++;
        }
        i++;
    }
    if(t1>0)
    {
        printf("No %d",t1);
    }

    else
    {
        while(s1[j]!='\0')
        {
            if(s1[j]!='*')
            {
                t2++;
            }
            j++;
        }
        printf("Yes %d",t2);
    }
   return 0;
}

1040 有几个PAT

#include<stdio.h>

int main()
{
    char s[100010];
    scanf("%s",s);
    long i=0,p=0,a=0,pat=0;

    while(s[i]!='\0')
    {
         if(s[i]=='P')
         {
             p++;
         }
         else
         {
             if(s[i]=='A')
             {
                 a+=p;
             }
             else
             {
                 if(s[i]=='T')
                 {
                     pat+=a;
                 }
             }
         }
         i++;
    }
    printf("%ld",pat%1000000007);
    return 0;
}

1041 考试座位号

#include<stdio.h>
int main()
{
    char sno[1010][20];
    int s[1010][2],N,M,m[1000];
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%s%d%d",sno[i],&s[i][0],&s[i][1]);
    }
    scanf("%d",&M);
    for(int i=0;i<M;i++)
    {
        scanf("%d",&m[i]);
    }

    for(int i=0;i<M;i++)
    {
        for(int j=0;j<N;j++)
        {
            if(m[i]==s[j][0])
            {
                printf("%s %d\n",sno[j],s[j][1]);
                break;
            }
        }
    }
    return 0;
}

1042 字符统计

#include<stdio.h>

int main()
{
    char str[1010];
    gets(str);

    int i=0,letter[26]={0};
    while(str[i]!='\0')
    {
        int temp;
        if(str[i]>='a'&&str[i]<='z')
        {
            temp=(int)str[i]-97;
            letter[temp]++;
        }
        else if(str[i]>='A'&&str[i]<='Z')
        {
            temp=(int)str[i]-65;
            letter[temp]++;
        }
        i++;
    }

    int max=0,t;
    for(int i=0;i<26;i++)
    {
        if(max<letter[i])
        {
            t=i;
            max=letter[i];
        }

    }

    printf("%c %d",t+97,max);
    return 0;
}

1043 输出PATest

#include<stdio.h>
int main()
{
    char str[10010];
    scanf("%s",str);
    int t[6]={0};

    int i=0;
    while(str[i]!='\0')
    {
        if(str[i]=='P')
          t[0]++;
        else if(str[i]=='A')
          t[1]++;
        else if(str[i]=='T')
          t[2]++;
        else if(str[i]=='t')
          t[5]++;
        else if(str[i]=='e')
          t[3]++;
        else if(str[i]=='s')
          t[4]++;
        i++;
    }
 
    int max=0;
    for(int i=0;i<6;i++)
    {
        if(max<t[i])
        max=t[i];
    }

    int r1,r2,r3,r4,r5,r6;
    for(int i=0;i<max;i++)
    {
        for(r1=i;r1<t[0];r1++)
        {
            printf("P");
            break;
        }
        for(r2=i;r2<t[1];r2++)
        {
            printf("A");
            break;
        }
        for(r3=i;r3<t[2];r3++)
        {
            printf("T");
            break;
        }
        for(r4=i;r4<t[3];r4++)
        {
            printf("e");
            break;
        }
        for(r5=i;r5<t[4];r5++)
        {
            printf("s");
            break;

        }
        for(r6=i;r6<t[5];r6++)
        {
            printf("t");
            break;
        }
    }
    return 0;

}

1046 划拳

#include<stdio.h>
int main()
{
    int N,n[110][5],sum1=0,sum2=0;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d%d%d%d",&n[i][0],&n[i][1],&n[i][2],&n[i][3]);
        
        if(n[i][1]==n[i][0]+n[i][2]&&n[i][3]!=n[i][0]+n[i][2])
          sum2++;
        if(n[i][1]!=n[i][0]+n[i][2]&&n[i][3]==n[i][0]+n[i][2])
         sum1++;
    }
    printf("%d %d",sum1,sum2);
    return 0;
}

1044 火星数字(未通过)

#include<stdio.h>
#include<string.h>

int main()
{
    int N;
    char num[100][20],num1[100][20];
    char s1[12][4]={{'j','a','n'},{'f','e','b'},{'m','a','r'},{'a','p','r'},{'m','a','y'},{'j','u','n'},{'j','l','y'},
    {'a','u','g'},{'s','e','p'},{'o','c','t'},{'n','o','v'},{'d','e','c'}};
    char s2[12][4]={{'t','a','m'},{'h','e','l'},{'m','a','a'},{'h','u','h'},{'t','o','u'},{'k','e','s'},{'h','e','i'},
    {'e','l','o'},{'s','y','y'},{'l','o','k'},{'m','e','r'},{'j','o','u'}};
    scanf("%d",&N);
    getchar();
    for(int i=0;i<N;i++)
    {
        gets(num[i]);
    }

    for(int i=0;i<N;i++)
    {
        //如果是地球文
        int j=0,sum=0,a=0,b=0,c=0;
        if(num[i][0]>='0'&&num[i][0]<='9')
        {
            while(num[i][j]!='\0')
            {
                 sum=sum*10+(int)num[i][j]-48; 
                 j++;
            }
           a=sum/13;
           strcpy(num1[i],s2[a-1]);
           b=sum%13;
           if(b!=0)
           {
           if(a==0)
           {
           //strcat(num1[i],s1[b-1]);
           num1[i][3]=s1[b-1][0];num1[i][4]=s1[b-1][1];num1[i][5]=s1[b-1][2];
           }
           else
           {
               num1[i][3]=' ';
               //strcat(num1[i],s1[b-1]);
               num1[i][4]=s1[b-1][0];num1[i][5]=s1[b-1][1];num1[i][5]=s1[b-1][2];
           }
           }
        }

        //如果是火星文
        
        else
        {
            int flag=0,flag1=0;
            a=0;b=0;c=0;
            for(int z=0;z<12;z++)
            {
                if(num[i][0]==s2[z][0]&&num[i][1]==s2[z][1]&&num[i][2]==s2[z][2])
                {
                    flag=1;
                    a=z;
                }
                if((num[i][4]==s1[z][0]&&num[i][5]==s1[z][1]&&num[i][6]==s1[z][2])||(num[i][0]==s1[z][0]&&num[i][1]==s1[z][1]&&num[i][2]==s1[z][2]))        
                {

                    flag1=1;
                    b=z;
                }
            }

            if(flag==1&&flag1==1)
            {
               c=(a+1)*13+b+1;
               if(c<100)
               {
                   num1[i][0]=(char)(c/10+48);
                   num1[i][1]=(char)(c%10+48);
               }
               else{
                   num1[i][0]=(char)(c/100+48);
                   c=c%100;
                   num1[i][1]=(char)(c/10+48);
                   num1[i][2]=(char)(c%10+48);
               }
            }

            if(flag==1&&flag1!=1)
            {
                c=13+a;
                num1[i][0]=(char)(c/10+48);
                num1[i][1]=(char)(c%10+48);
            }

            if(flag!=1&&flag1==1)
            {
                c=b+1;
                if(c<10)
                {
                    num1[i][0]=(char)(c+48);

                }
                else
                {
                    num1[i][0]=(char)(c/10+48);
                    num1[i][1]=(char)(c%10+48);
                }
            }

        }
    }

   for(int i=0;i<N;i++)
   {
       puts(num1[i]);
   }
   return 0;

}

1047 编程团体赛

#include<stdio.h>
int main()
{
    int N,n[1010]={0},t,s,z;
    scanf("%d",&N);

    for(int i=0;i<N;i++)
    {
        scanf("%d-%d %d",&t,&z,&s);
        n[t]+=s;
    }
    
    int max=-1,q=0;
    for(int i=0;i<1010;i++)
    {
        if(max<n[i])
        {
            q=i;
            max=n[i];
        }
    }
    printf("%d %d",q,max);
    return 0;
}
posted @ 2019-12-07 17:47  翁德彪  阅读(203)  评论(0编辑  收藏  举报