oj中的题目:
塔罗将要玩纸牌游戏。然而,现在他只有n张牌,尽管应该有52张牌(他没有小丑)。
这52张牌包括四套牌中的13个等级:黑桃牌、红桃牌、梅花牌和钻石牌。
输入
在第一行中,卡的数量n(n≤ 52)已给出。
在下面的n行中,给出了n个卡的数据。每张卡片由一对字符和一个整数组成,分别代表其花色和等级。花色分别用黑桃、红桃、梅花和钻石的“S”、“H”、“C”和“D”表示。等级由1到13之间的整数表示。
输出
打印丢失的卡片。与输入格式相同,每张卡片应打印一个字符和一个整数,并在一行中用空格字符分隔。按以下优先顺序排列丢失的卡片:
- 按黑桃、红桃、梅花、钻石的顺序打印卡片。
- 如果花色相同,则先打印等级较低的卡片。
先上代码:
#include<stdio.h>
struct card
{
char color;
int num;
};
struct card t[52];
int main()
{
int n;
scanf("%d", &n);
char c = getchar();//吸收 多余的那个空格或确认键
int i = 0,j=0;
for (i = 0; i < n; i++)
{
scanf("%c%d%c", &t[i].color, &t[i].num,&c);//输入卡片
}
char arr[4] = { 'S','H','C','D' };//四种花色
int cout = 0;
for (int k = 0; k < 4; k++)//四种花色循环四遍
{
for (i = 1; i <= 13; i++)//从1~13共比较13次
{
cout = 0;//重置计数器
for (j = 0; j < n; j++)//从每个花色中的i与现有的相同花色的所有卡片比较
{
if (t[j].color == arr[k])
{
if (t[j].num == i)
break;//相等的话说明已有卡片,无需继续比较了
}
cout++;
}
if (cout == n)//相等 说明这张卡片缺失了
printf("%c %d\n",arr[k],i);
}
}
return 0;
}
我的思路很简单,就是 拿各个花色的各个数字与所有的已有卡片进行比较,思路很容易想到的,就不多赘述。
主要说说一些注意的点:
scanf("%d", &n);
char c = getchar();//吸收 多余的那个空格或确认键
输入卡的数量后,我们会按下空格,或者Enter键,如果下面要输入的是数字,那当然无所谓了,
可下面要输入花色,那就问题大了,别忘了,空格和Enter键也是字符,会被读入的,这就造成很多无用数据被读入,而有用数据无法读入完整。
解决方案:
char c = getchar(); 用c来接取那个无用字符;
同理:
scanf("%c%d%c", &t[i].color, &t[i].num,&c)这里的c也是用来接取空格;
希望能帮助到大家~