码迷,mamicode.com
首页 > 其他好文 > 详细

扑克牌顺子

时间:2016-07-04 23:28:28      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

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

思路:把数组排序,统计数组中0的个数,统计排序之后的数组相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子。

  1 #include "stdafx.h"
  2 #include <stdlib.h>
  3 
  4 int compare(const void* arg1, const void* arg2);
  5 
  6 bool IsContinuous(int* numbers, int length)
  7 {
  8     if(numbers == NULL || length < 1)
  9         return false;
 10 
 11     qsort(numbers, length, sizeof(int), compare);
 12 
 13     int numberOfZero = 0;
 14     int numberOfGap = 0;
 15 
 16     for(int i = 0 ; i < length && numbers[i] == 0 ; ++ i)
 17         ++ numberOfZero;
 18 
 19     int small = numberOfZero;
 20     int big = small + 1;
 21 
 22     while(big < length)
 23     {
 24         if(numbers[small] == numbers[big])
 25             return false;
 26 
 27         numberOfGap += numbers[big] -numbers[small] - 1;
 28         small = big;
 29 
 30         ++ big;
 31     }
 32 
 33     return (numberOfGap > numberOfZero) ? false : true;
 34 }
 35 
 36 int compare(const void* arg1, const void * arg2)
 37 {
 38     return *(int*)arg1 - *(int*)arg2;
 39 }
 40 
 41 void Test(char* testName, int* numbers, int length, bool expected)
 42 {
 43     if(testName != NULL)
 44         printf("%s begins: \n", testName);
 45 
 46     if(IsContinuous(numbers, length) == expected)
 47         printf("Passed\n");
 48     else
 49         printf("Failed\n");
 50 }
 51 
 52 void Test1()
 53 {
 54     int numbers[] = {1,3,2,5,4};
 55     Test("Test1", numbers, sizeof(numbers) / sizeof(int), true);
 56 }
 57 
 58 void Test2()
 59 {
 60     int numbers[] = {1,3,2,6,4};
 61     Test("Test2", numbers, sizeof(numbers)/sizeof(int), false);
 62 }
 63 
 64 void Test3()
 65 {
 66     int numbers[] = {0,3,2,6,4};
 67     Test("Test3", numbers, sizeof(numbers)/ sizeof(int), true);
 68 }
 69 
 70 void Test4()
 71 {
 72     int numbers[] = {0,3,1,6,4};
 73     Test("Test4", numbers, sizeof(numbers) / sizeof(int), false);
 74 }
 75 
 76 void Test5()
 77 {
 78     int numbers[] = {1,3,0,5,0};
 79     Test("Test5", numbers, sizeof(numbers)/ sizeof(int), true);
 80 }
 81 
 82 int main()
 83 {
 84     int numbers[] = {1,3,2,5,4};
 85     int length = sizeof(numbers) / sizeof(int);
 86     printf("the array number is:\n");
 87     for(int i = 0 ;  i < length; i ++)
 88         printf("%d\t", numbers[i]);
 89     printf("\n");
 90     if(IsContinuous(numbers, length))
 91         printf("is Continuous.\n");
 92     else
 93         printf("not Continuous.\n");
 94         
 95     printf("\n");
 96     int numbers1[] = {1,3,0,5,0};
 97     length = sizeof(numbers1) / sizeof(int);
 98     printf("the array number is:\n");
 99     for(int i = 0 ;  i < length; i ++)
100         printf("%d\t", numbers1[i]);
101     printf("\n");
102     if(IsContinuous(numbers1, length))
103         printf("is Continuous.\n");
104     else
105         printf("not Continuous.\n");
106         
107     printf("\n");
108     int numbers2[] = {1,3,2,6,4};
109     length = sizeof(numbers2) / sizeof(int);
110     printf("the array number is:\n");
111     for(int i = 0 ;  i < length; i ++)
112         printf("%d\t", numbers2[i]);
113     printf("\n");
114     if(IsContinuous(numbers2, length))
115         printf("is Continuous.\n");
116     else
117         printf("not Continuous.\n");
118 }

技术分享

扑克牌顺子

标签:

原文地址:http://www.cnblogs.com/sankexin/p/5641844.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!