从扑克牌中随机抽取5张牌,判断是不是一个顺子。

一、算法描述:

从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字

二、算法解决:

在这个算法里,由于大小王可以是任意数字,所以即使像下面的5张牌,仍然可以是连续的。


图1


图2

所以说1的个数和数据之间的间隔和的关系决定了是不是一个连续的5个数。

以图2为例进行推导。


首先,先计算数组中含有0的个数。

IsZero = 2;

然后,将数组进行排序


图3

从数组numbers的4开始看数据间的间隔(numbers[i+1]-numbers[i]-1)

即从numbers[IsZero]开始进行统计

LenGap = 2

如果LenGap大于IsZero,则不能形成连续数组,否则可以形成连续数组。

三、算法实现:

算法通过Linux下运行的,主要包括continusCards.c,continusCards.h,main.c,Makefile四个文件

make
即可得到结果

/*************************************************************************
	> File Name: continusCards.c
	> Author: cyf
	> Mail: XXX@qq.com 
	> Created Time: 2016年04月06日 星期三 14时56分30秒
 ************************************************************************/

#include "continusCards.h"

/*
 * 从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的
 * 2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字
 * */
int InsertSort(int *numbers, int length)
{
	int ret = 0;
	if (numbers == NULL || length < 1)
	{
		ret = -1;
		printf("func InsertSort() err:param\n");
	}

	int i = 0, j = 0;
	int temp = 0;

	for (i = 0; i < length; i++)
	{
		for (j = i + 1; j < length; j++)
		{
			if (numbers[i] > numbers[j])
			{
				temp = numbers[i];
				numbers[i] = numbers[j];
				numbers[j] = temp;
			}
		}
	}
	return ret;
}
int IsContinous(int *numbers, int length)
{
	/*
	 * 先将数组进行排序,然后记录数组中0的个数
	 * 记录数组中的差距和,比较0的个数和数组差距
	 * */
	int ret = 0;
	if (numbers == NULL || length <1)
	{
		ret = -1;
		return -1;
	}

	int IsZero = 0;
	int GapLen = 0;
	int i = 0;

	for (i = 0; i < length; i ++)
	{
		if (numbers[i] == 0)
		{
			IsZero ++;
		}

	}

	InsertSort(numbers, length);
	int pBegin = IsZero;
	int pEnd = IsZero + 1;
	
	while (pEnd < length)
	{
		if (numbers[pBegin] == numbers[pEnd])
			ret = 1;
		
		GapLen = numbers[pEnd] - numbers[pBegin] - 1;
		pBegin = pEnd;
		pEnd ++;
	}

	if (GapLen > IsZero)
		ret = 1;

	return ret;
}

/*************************************************************************
	> File Name: continusCards.h
	> Author: cyf
	> Mail: XXX@qq.com 
	> Created Time: 2016年04月06日 星期三 14时48分52秒
 ************************************************************************/

#ifndef CONTINUSCARDS_H
#define CONTINUSCARDS_H

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

int IsContinous(int *numbers, int length);
#endif

/*************************************************************************
	> File Name: main.c
	> Author: cyf
	> Mail: XXX@qq.com 
	> Created Time: 2016年04月06日 星期三 15时19分36秒
 ************************************************************************/

#include "continusCards.h"
int Test(char *testName, int *numbers, int length, int expected)
{
	int ret = 0;
	if (testName == NULL || numbers == NULL ||length <1)
	{
		ret = -1;
		printf("func Test() err:param\n");
	}
	
	int result = 0;
	result = IsContinous(numbers, length);

	if (result == expected)
		printf("Test:%s is success!\n", testName);
	else
		printf("Test:%s is success!\n", testName);

	return ret;
}
int main()
{
	int rv = 0;
	int testNumbers[5] = {9, 0, 5, 8, 7};
	int testNumbers1[5] = {0, 1, 5, 1, 3};
	int testNumbers2[5] = {0, 0, 5, 1, 3};
	rv = Test("test1", testNumbers, 5, 0);
	if (rv == -1)
	{
		printf("func Test() err\n");
	}
	rv = Test("test2", testNumbers1, 5, 1);
	if (rv == -1)
	{
		printf("func Test() err\n");
	}

	rv = Test("test3", testNumbers2, 5, 0);
	if (rv == -1)
	{
		printf("func Test() err\n");
	}

	return 0;
}

CC = gcc
CFLAGS = -g

%.o:%.c
	$(CC) -o $@ -c $(CFLAGS) $<

main:main.o continusCards.o
	$(CC) main.o continusCards.o -o main $(CFLAGS)

clean:
	rm -rf *.o main






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiluohan0307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值