040

来源:互联网 发布:儿童学编程什么教材好 编辑:程序博客网 时间:2024/06/11 18:48
// 040.cpp : Defines the entry point for the console application.//#include "stdafx.h"bool IsContinue(int *pData, int len, int maxNum){if (NULL == pData || maxNum > 13){return false;}for (int pos=1; pos<len; pos++){for (int i=0; i<pos; i++){if (pData[i] > pData[pos]){int tmp = pData[i];pData[i] = pData[pos];pData[pos] = tmp;}}}int numOfZero = 0;//0的个数int numOfGap  = 0;//空缺个数int i=0;while(pData[i++] == 0 && (numOfZero <= 2)){numOfZero++;}//pData[numOfZero]指向了第一个最小的数据int *pSmallNum = &pData[numOfZero];int *pBigNum = pSmallNum+1;while(pBigNum < (pData+len)){if (*pBigNum == *pSmallNum)//存在相同的两个数据{return false;}numOfGap += *pBigNum - *pSmallNum - 1;//统计所有的空缺pSmallNum = pBigNum;pBigNum++;}if (numOfGap <= numOfZero){return true;}else{return false;}}/*题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。分析:这题目很有意思,是一个典型的寓教于乐的题目。我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但如果我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5}。在1和3之间空缺了一个2,刚好我们有一个0,也就是我们可以它当成2去填补这个空缺。 于是我们需要做三件事情:把数组排序,统计数组中0的个数,统计排序之后的数组相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子.*///扑克牌的顺子  int main(int argc, char* argv[]){/*printf("Hello World!\n");*/int data[5] = {0,11,16,13,0};bool bRet = IsContinue(data,5,13);if (bRet){printf("IS continus!\n");}else{printf("IS not continus!\n");}return 0;}