PAT-B 1018. 锤子剪刀布 (20)

博客详细解析了PAT B 1018题目的解决方案,通过将输入的锤子剪刀布字符转换为ASCII码进行判断,避免了字符串比较。代码简洁高效,强调字符转ASCII码的技巧,即字符-''来获取ASCII值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接在此

该题没有什么拐弯之处,只需要把题意实现即可。

我的做法是将输入的B、C、F字符转换成对应的ASCII码,以逃避用串比较函数来进行一些字符相等的判断。
此处需要注意的是,想要将一个字符转换成其ASCII码,只需要用字符-‘\0’(而不是‘0’)即可。

下面贴出我的AC代码:

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

int main(){

    int n;
    scanf("%d",&n);
    getchar();

    char j,y;
    int jWinTimes = 0, yWinTimes = 0; //甲、乙获胜的次数
    //甲乙两方每个手势获胜的次数 
    int jB = 0, jC = 0, jJ = 0; 
    int yB = 0, yC = 0, yJ = 0;

    for(int i = 0 ; i < n; i++){
        scanf("%c %c", &j, &y);
        if(i<n-1){
            getchar();          
        }
        int jnum = j-'\0';
        int ynum = y-'\0';

        //统计甲获胜的情况 
        if(jnum == 66 && ynum == 67){
            jB++;
            jWinTimes ++;
        }else if(jnum == 67 && ynum == 74){
            jC++;
            jWinTimes++;
        } else if(jnum == 74 && ynum == 66){
            jJ++;
            jWinTimes++;
        }

        //统计乙获胜的情况
        if(jnum == 67 && ynum == 66){
            yB++;
            yWinTimes++;
        } else if(jnum == 74 && ynum == 67){
            yC++;
            yWinTimes++;
        } else if(jnum == 66 && ynum == 74){
            yJ++;
            yWinTimes++;
        }

    } 

    printf("%d %d %d\n",jWinTimes,n-jWinTimes-yWinTimes,yWinTimes);
    printf("%d %d %d\n",yWinTimes,n-jWinTimes-yWinTimes,jWinTimes);

    //拿到甲、乙获胜最多手势
    int jmax = jB;
    char J = 'B'; 
    if(jmax < jC){
        jmax = jC;
        J = 'C';
    }
    if(jmax < jJ){
        jmax = jJ;
        J = 'J';
    }       

    int ymax = yB;
    char Y = 'B';
    if(ymax < yC){
        ymax = yC;
        Y = 'C';
    }
    if(ymax < yJ){
        ymax = yJ;
        Y = 'J';
    }

    printf("%c %c\n",J,Y);


    return 0;
}

《算法笔记上机训练实践指南》中的解法在代码的构造上显得更为巧妙,总体的算法思想并无二异,故此处不过多赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值