题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
分析:将其转换为整数数组,大小王为0,将数组排序,统计数组中的0的个数以及空缺的个数,因为0可以补空缺,空缺是指两个整数差值大于1时的差值,比如2和4之间不连续,空缺1,如果0的个数不小于空缺的个数,说明是顺子,否则不是顺子。
#include <stdio.h>
void sort(int a[], int len)//因为规模很小,冒泡排序就能解决
{
bool flag = true;
int k = len-1;
int j,temp;
while(flag && k>=0)
{
flag = false;
for(j=1;j<=k;j++)
{
if(a[j-1]>a[j])
{
flag = true;
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
k--;
}
}
bool is_shunzi(int *a, int len)
{
if(a==NULL || len<=0 || len>5)
return false;
sort(a,len);
int num_0 = 0;//统计0的个数
int num_gap = 0;//统计空缺的个数
int i;
int small,big;
for(i=0;i<=len-1;i++)
{
if(a[i]!=0)
{
break;
}
else if(a[i]==0)
{
num_0++;
}
}
small = i;//将0后出现的第一个非0位置赋值给small
big = small + 1;//big是small的后一位置
while(big < len)
{
if(a[small] == a[big])//两个值相等,是对子,不是顺子
return false;
if(a[big]-a[small] == 1)//如果两个值差1,说明两个值是连续的
{
small = big;
big++;
}
else if(a[big]-a[small]>1)//如果两个值之差大于1,说明两个数之间必有空缺
{
num_gap += a[big]-a[small]-1;//统计空缺的个数
small = big;
big++;
}
}
return (num_0 >= num_gap) ? true : false;//如果0的个数不少于空缺的个数,说明是顺子,否则不是
}
int main()
{
char s[6];
int a[5];
printf("请抽5张牌:\n");
scanf("%s",s);
int i;
for(i=0;i<5;i++)
{
if(s[i]>='2'&& s[i]<='9')//这里犯了一个低级错误,ASCII码没有'10',数字最大到'9',需要牢记
{
a[i] = s[i] - '0';
}
else if(s[i] == '10')
a[i] = 10;
else if(s[i] == 'A')
a[i] = 1;
else if(s[i] == 'J')
a[i] = 11;
else if(s[i] == 'Q')
a[i] = 12;
else if(s[i] == 'K')
a[i] = 13;
else if(s[i] == '#')//大小王
a[i] = 0;
}
bool flag = is_shunzi(a,5);
if(flag)
printf("%s是一个顺子\n",s);
else
printf("%s不是一个顺子\n",s);
return 0;
}