PAT (Basic Level) Practice 1018 锤子剪刀布

一、概述

输入若干次两人对战记录,输出双方各自胜负平的次数,并输出胜率最高的出法,若有胜率相等的,按字典序输出。

本题易错点在于利用scanf记录输入的字符时容易出错。以及按字典序输出时容易写的很麻烦。我就是这样。

二、分析

1、输入

样例如下

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

如果直接按

scanf("%c %c",&A,&B);
//或
scanf("%c,%c",&A,&B);
//或
scanf(" %c, %c",&A,&B);

这三种的任意一种输入,都不可行,原因如下:

第一种:需要输入是“字符空格*n换行*n字符”,而实际上我们的输入是“换行字符空格字符”

第二种:需要输入是“字符逗号字符”,同理。

第三种:需要输入的是“空格*n换行*n字符逗号空格*n换行*n字符”,同理。

即:

scanf中双引号中的内容即是输入模式,双引号中有逗号,输入时就要有逗号,双引号中有空格,则代表着若干个空格加上若干个换行。因此,我们的输入如下:

scanf(" %c %c");

即可。也可用getchar函数吃掉第一个换行。

2、输出胜率最高的出法

我是一堆if else来算的。很是麻烦。分成七种情况:

B最大,C最大,J最大,B==C且J最小,B==J且C最小,C==J且B最小,三者相等。

实际上可以用字母转换为数字,将最开始输入的BCJ转为012,然后会简单很多。

三、总结

字母转数字的方法很好,可以省去很多行代码,但是想到这个方法还是要花一点时间的。

PS:代码如下:

#include<stdio.h>
int main()
{
	int count;
	scanf("%d", &count);
	int i = 0;
	char A, B;
	int winA = 0, winB = 0, loseA = 0, loseB = 0, equal = 0;
	int winAC = 0, winAJ = 0, winAB = 0;
	int winBC = 0, winBJ = 0, winBB = 0;
	while (i < count)
	{
		scanf(" %c %c", &A, &B);
		if (A == B)
			equal++;
		else if (A == 'C'&&B == 'J')
		{
			winA++;
			loseB++;
			winAC++;
		}
		else if (A == 'C'&&B == 'B')
		{
			winB++;
			loseA++;
			winBB++;
		}
		else if (A == 'J'&&B == 'C')
		{
			winB++;
			loseA++;
			winBC++;
		}
		else if (A == 'J'&&B == 'B')
		{
			winA++;
			loseB++;
			winAJ++;
		}
		else if (A == 'B'&&B == 'J')
		{
			winB++;
			loseA++;
			winBJ++;
		}
		else if (A == 'B'&&B == 'C')
		{
			winA++;
			loseB++;
			winAB++;
		}
		i++;
	}
	printf("%d %d %d\n", winA, equal, loseA);
	printf("%d %d %d\n", winB, equal, loseB);
	if (winAB > winAC&&winAB > winAJ)
		printf("B ");
	else if (winAC > winAB&&winAC > winAJ)
		printf("C ");
	else if (winAJ > winAC&&winAJ > winAB)
		printf("J ");
	else if (winAB == winAC&&winAB > winAJ)
		printf("B ");
	else if (winAB == winAJ&&winAB > winAC)
		printf("B ");
	else if (winAJ == winAC&&winAJ > winAB)
		printf("C ");
	else
		printf("B ");
	if (winBB > winBC&&winBB > winBJ)
		printf("B");
	else if (winBC > winBB&&winBC > winBJ)
		printf("C");
	else if (winBJ > winBC&&winBJ > winBB)
		printf("J");
	else if (winBB == winBC&&winBB > winBJ)
		printf("B");
	else if (winBB == winBJ&&winBB > winBC)
		printf("B");
	else if (winBJ == winBC&&winBJ > winBB)
		printf("C");
	else
		printf("B");
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值