C语言实现:从一副扑克中随机抽取5张牌,在不使用排序的情况下,判断是不是顺子

题目:

从一副扑克(52张)中随机抽取5张牌,在不使用排序的情况下,判断是不是顺子。

思路:

  1. 利用rand()来随机生成5个数字,模拟抽牌;
  2. 顺子即公差为1的等差数列,可以利用等差数列的性质来判断。

具体实现:

一、生成随机数

  • 利用rand()生成的随机数对13取余并加1来保证每次生成的随机数在1到13之间
  • 生成的每个随机数之间和每组随机数之间都要休眠一会,避免在短时间内迅速生成了大量相同的数

二、判断

  • 不能排序,所以利用等差数列的性质来判断,此时就需要满足3个条件
    1、找出最大值和最小值,且满足等差数列“(最大值+最小值)抽取牌数/2 = 所抽牌数值之和”的性质;
    2、遍历5张牌,没有两两相同的数值;
    3、保证公差为1,即最大值减去最小值等于抽取的牌数减1。

代码:

#include 
#include 
#include 
#include 
#include 
#define NUM_OF_CARD 4   //抽取的牌数
#define MAX_NUM 13  //扑克牌中的最大数

int main()
{
    while(1)    //无限尝试,直到抽到为止
    {
        int i = 0;
        int j = 0;
        int tmp = 0;    //检验抽的牌中是否有相同数值的中间变量
        int max_num = 0;    //抽取的最大牌
        int min_num = 0;    //抽取的最小牌
        int sum = 0;        //抽到的牌数值之和
        int *card = NULL;
        
        card = (int *) calloc(sizeof(int), NUM_OF_CARD); //生成存储要抽的牌的空间
        srand((unsigned) time(NULL));  //以时间为种子,生成随机数,即为牌的大小
        for(i = 0; i < NUM_OF_CARD; i++)
        {
            Sleep((rand() % 200) + 200);    //避免短时间内瞬间生成的数都相同
            card[i] = (rand() % MAX_NUM) + 1;   //确定数的范围并生成
            sum += card[i];
        }
        for(i = 0, min_num = card[0]; i < NUM_OF_CARD; i++)    //找出最大值和最小值
        {
            if(card[i] > max_num)
                max_num = card[i];
            if(card[i] < min_num)
                min_num = card[i];
        }
        for(i = 0; i < NUM_OF_CARD; i++)
        {
            for(j = i + 1; j < NUM_OF_CARD; j++)
            {
                if(card[i] == card[j])
                    tmp++;
            }
        }
        //符合3个条件则为顺子,输出
        if((min_num + max_num) * NUM_OF_CARD / 2 == sum && tmp == 0 && max_num - min_num == NUM_OF_CARD - 1)
        {
            printf("-----------------------------------\n抽到顺子了!!!\n", NUM_OF_CARD);
            for(i = 0; i < NUM_OF_CARD; i++)
            {
                printf("%d  ", card[i]);
            }
            printf("\n");
            system("pause");
        }
        else
        {
            printf("这次抽到的%d张牌不是顺子:", NUM_OF_CARD);
            for(i = 0; i < NUM_OF_CARD; i++)
            {
                printf("%d  ", card[i]);
            }
        }
        printf("\n");
        
        free(card); //释放malloc分配的内存空间
    }
    return 0;
}

遇到的问题:

  1. 开始未加入判断公差为1的条件时,出现不是等差数列或公差不为1的情况,如:2,4,6,8,10,等。例如:
    C语言实现:从一副扑克中随机抽取5张牌,在不使用排序的情况下,判断是不是顺子_第1张图片

  2. 开始生成随机数时,未进行休眠操作,因为是以时间为种子,所以导致短时间内生成的5个数基本相同:
    C语言实现:从一副扑克中随机抽取5张牌,在不使用排序的情况下,判断是不是顺子_第2张图片在加入了休眠操作之后,生成的数字不再批量相同:
    C语言实现:从一副扑克中随机抽取5张牌,在不使用排序的情况下,判断是不是顺子_第3张图片

    所幸这些问题都得到了解决。

最终运行结果:
C语言实现:从一副扑克中随机抽取5张牌,在不使用排序的情况下,判断是不是顺子_第4张图片
**

  • 程序练习,仅为一种思路,若有错误请指出。

**

你可能感兴趣的:(C)