pat的A1042 Shuffling Machine,A1046 Shortest Distance,A1065.A+B and C,A1002A+B for Polynom等相关代码与自己错误思考

最近刷的pat题代码,感觉自己写代码速度还是太慢,总之一步步来吧,自己还是要努力呀!!!

pat上题目代码有的我注释了一些自己的看法与自己写错的地方,为什么会错,希望能帮助到别人(嘻嘻)!

以下是代码。。。

//B1012.数字分类
#include<cstdio>
int main(){
    int a[1100]={0};
    int i,n,A1=0,A2=0,A3=0,A4=0,A5=0,t=1,c=0,f=0,d=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(a[i]%5==0&&a[i]%2==0){
            f++;
            A1+=a[i];
        }
        if(a[i]%5==1){
            t++;
            if(t%2==0)
                A2+=a[i];
            else
                A2-=a[i];
        }
        if(a[i]%5==2){
            A3++;
        }
        if(a[i]%5==3){
            c++;
            A4+=a[i];
        }
        if(a[i]%5==4){
            d++;
            if(a[i]>A5)
                A5=a[i];
        }
    }
    if(f!=0)
        printf("%d ",A1);
    else
        printf("N ");
    if(t!=1)//注意一下,这是个比较繁琐的,但是为了迎合之前的代码,所以设置成t!=1。。。。尽量不要这样做
        printf("%d ",A2);
    else
        printf("N ");
    if(A3!=0)
        printf("%d ",A3);
    else
        printf("N ");
    if(c!=0){
        printf("%.1f ",(double)A4/c);
    }
    else
        printf("N ");
    if(d!=0)
        printf("%d",A5);
    else
        printf("N");

return 0;
}

B1018锤子剪刀布
#include<cstdio>
//#include<algorithm>
int change(char c){//此题主要是用到了将BCJ转化成数字这样可以方便问题的简化与求解!当然套路都是通过大量的做题一个一个总结的
    if(c=='B') return 0;
    if(c=='C') return 1;
    if(c=='J') return 2;
}
int main(){
    char mp[3]={'B','C','J'};
    int n;
    scanf("%d",&n);
    int A[3]={0};int B[3]={0};
    int hand_A[3]={0},hand_B[3]={0};
    char c1,c2;
    int k1,k2;
    int i,j;
    for(int i=0;i<n;i++){
        getchar();
       scanf("%c %c",&c1,&c2);
       k1=change(c1);k2=change(c2);
       if((k1+1)%3==k2){
       A[0]++;
       B[2]++;
       hand_A[k1]++;
       }
       if((k2+1)%3==k1){
           A[2]++;
           B[0]++;
           hand_B[k2]++;
       }
       if(k1==k2){
           A[1]++;
           B[1]++;
           //hand_A[k1]++;
           //hand_B[k1]++;
       }
    }
       printf("%d %d %d\n",A[0],A[1],A[2]);
       printf("%d %d %d\n",B[0],B[1],B[2]);
       if(hand_A[0]>=hand_A[1]&&hand_A[0]>=hand_A[2])
           i=0;
       else if(hand_A[1]>=hand_A[2])
           i=1;
       else
           i=2;
       if(hand_B[0]>=hand_B[1]&&hand_B[0]>=hand_B[2])
           j=0;
         else if(hand_B[1]>=hand_B[2])
           j=1;
          else
           j=2;
         printf("%c %c",mp[i],mp[j]);
         return 0;
}

 

//A1042 Shuffling Machine
#include<cstdio>
const int n=54;
char mp[5]={'S','H','C','D','J'};
int start[n+1],change[n+1],next[n+1];
int main(){
    int k,i;
    scanf("%d",&k);
    getchar();
    for(i=1;i<=n;i++)
        start[i]=i;
    for(i=1;i<=n;i++){
        int u;
        scanf("%d",&u);
        change[i]=u;
    }
    for(int j=0;j<k;j++){
        for(i=1;i<=n;i++){
            next[change[i]]=start[i];
        }
        for(i=1;i<=n;i++){
            start[i]=next[i];//将next数组赋值给start数组,以方便数组下次使用
        }
    }
    for(i=1;i<=n;i++){
        if(i!=1)
            printf(" ");//注意一下最后一个不要空格,所以如果你在下面printf里面加空格其实在pat里面编译会出现错误的,错误是格式错误,你会一分得不到,所以在这一定要注意以下
        printf("%c%d",mp[(start[i]-1)/13],(start[i]-1)%13+1);
    }
    return 0;

}

 

#include<cstdio>
#include<algorithm>
//using namespace std;
int main(){
    int k,i,j,sum=0,first,last,t,u;
    int a[110000],dist[110000];
    scanf("%d",&k);
    for(i=1;i<=k;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
        dist[i]=sum;
    }
    scanf("%d",&j);
    for(i=0;i<j;i++){
        scanf("%d%d",&first,&last);
        if(first<=last){
            t=dist[last]-dist[first];
            u=sum-t;//不是正向的一条边一定是反向的一条边,不存在一个顶点与大于两条的边相连。
            if(t<=u)
                printf("%d\n",t);
            else printf("%d\n",u);
        }
        else{
            std::swap(first,last);//通常不采用std::通常采用using namespace std!
            t=dist[last]-dist[first];
            u=sum-t;
            if(t<=u)
                printf("%d\n",t);
            else printf("%d\n",u);
        }
    }
    return 0;

}

 

 

//A1065.A+B and C
#include<cstdio>>
int main(){
    int n;
    long long A,B,C,t;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld%lld",&A,&B,&C);
        t=A+B;
        if(a>0&&b>0&&t<0)
            printf("case #%d: true\n",i);//主要是需要考虑溢出的情况,当出现正溢出时表示ab之和一定是大于c的,当出现负溢出时,ab之和一定是小于c的。
        if(t>c)
            printf("Case #%d: true\n",i);
        if(t<=C&&C>0)
            printf("Case #%d: false\n",i);
        if(A<0&&B<0&&t>=0)
            printf("Case #%d: false\n",i);
    }
    return 0;
}

 

B1010 一元多项式求导
#include<cstdio>
//当发现你输入到数组的数自己无法找出来操作时,可以遍历整个数组,个人感觉效率有点低!!!
int main(){
    int a[1100];
    int i,k,e,count=0;
    while(scanf("%d%d",&k,&e)!=EOF){
        a[e]=k;
    }
    a[0]=0;
    for(i=1;i<=1000;i++){
        a[i-1]=a[i]*i;
        a[i]=0;
        if(a[i-1]!=0)
            count++;
    }
    if(count==0)
        printf("0 0");
    //for(i=1000;i<=1000;i--){,在这里出现错误,我感觉这是一个非常低级的错误,边界条件一定是i>=0
    for(i=1000;i>=0:i--){
        if(a[i]!=0){
        printf("%d %d",a[i],i);
        count--;
        if(count!=0)
            printf(" ");
        }
    }
    return 0;
}

 

//A1002A+B for Polynomials
#include<cstdio>
const int max=1111;
int main(){
    int i,count=0,k,n;
    double e;
    double a[max]={ };
    scanf("%d",&k);
        for(i=0;i<k;i++){
        scanf("%d %lf",&n,&e);
        a[n]+=e;
        }
    scanf("%d",&k);
        for(i=0;i<k;i++){
        scanf("%d %lf",&n,&e);
        a[n]+=e;
        }
    for(i=0;i<max;i++){
        if(a[i]!=0)
            count++;
    }
    printf("%d",count);//注意:这里不能在%d后面加空格,再使用我下面注释掉的语句的方法,因为这样写会出现有一种可能,就是输入的两个式子均为0,此时只用输出0即可,后面的不用输出了,但是此时若在%d后面加空格会出现一个多余的空格,所以此方法不可取!!!
    for(i=1100-1;i>=0;i--){
        if(a[i]!=0){
            printf(" %d %.1f",i,a[i]);
            /*if(count!=1){
                count--;
                printf(" ");
            }*/
            }
        }
    return 0;
}

 

总之,个人感觉想学好计算机,最重要的还是敲代码!一起加油吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值