推断5张扑克牌的组成

一副牌中发五张扑克牌给你,让你推断数字的组成:

有下面几种情况:

1:四条:即四张一样数值的牌(牌均不论花色)

2:三条带一对

3:三条带两张不同样数值的牌

4:两对

5:顺子(包含10,J,Q,K,A)

6:什么都不是

7:仅仅有一对

分析:

应该不包括大小王,另外J、Q、K、A分别相当于11、12、13、14,尽管从2到A一共是13张牌。可是为了方便相应,使用了一个包括15个元素的数组来记录每个点数出现的次数(舍弃0号元素和1号元素)。

为了记录发给你的5张牌。直接用整型肯定不行,不能接受J、Q、K、A的输入,刚開始的时候准备使用一个字符数组接受输入,然后再转换为整型。可是字符输入是不能接受10这种输入的,最后仅仅能使用字符串数组接受输入。

C代码例如以下:

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

#define LEN 5
#define TOTAL_LEN 15 

char str_poker[LEN][3];
int int_poker[LEN] = {0};
int total_poker[TOTAL_LEN] = {0};

void check(int len, int poker[]);
void ch_to_int(int len, char str_array[][3], int int_array[]);
void int_sort(int len, int a[]);

int main()
{
	int i;
	printf("please input your cards:");
	for(i=0; i<LEN; i++)
		scanf("%s",str_poker[i]);
	ch_to_int(LEN, str_poker, int_poker);
	printf("the result is:");
	check(LEN, int_poker);
	return 0;
}

void ch_to_int(int len, char str_array[][3], int int_array[])
{
	int i;
	for(i=0; i<LEN; i++)
	{
		if(strcmp(str_array[i],"10") == 0)
		{
			int_array[i] = 10;
			continue;
		}
		if(strcmp(str_array[i],"J") == 0)
		{
			int_array[i] = 11;
			continue;
		}
		if(strcmp(str_array[i],"Q") == 0)
		{
			int_array[i] = 12;
			continue;
		}
		if(strcmp(str_array[i],"K") == 0)
		{
			int_array[i] = 13;
			continue;
		}
		if(strcmp(str_array[i],"A") == 0)
		{
			int_array[i] = 14;
			continue;
		}
		int_array[i] = atoi(str_array[i]);
	}
}

void int_sort(int len, int a[])
{
	int i,j,temp;
	for(i=0; i<len-1; i++)
		for(j=0; j<len-1; j++)
			if(a[j] > a[j+1])
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
}

void check(int len, int poker[])
{
	int i;
	int res = 1;
	for(i=0; i<LEN; i++)
		total_poker[poker[i]]++;
	for(i=1; i<=TOTAL_LEN; i++)
	{
		if(total_poker[i] == 4)
		{
			printf("四条加一张\n");
			return;
		}
		if(total_poker[i] >= 2)
			res *= total_poker[i];
	}
	if(res > 1)
	{
		switch(res)
		{
		case 2:
			printf("一对加三张不同\n");
			break;
		case 3:
			printf("三条加两张不同\n");
			break;
		case 4:
			printf("两队加一张\n");
			break;
		case 6:
			printf("三条加一对\n");
			break;
		}
	}
	else
	{
		int_sort(LEN, poker);
		for(i=0; i<LEN-1; i++)
		{
			if(poker[i+1] != poker[i] + 1)
			{
				printf("什么都不是\n");
				return;
			}
		}
		printf("五张顺子\n");
	}
}

几组測试用比例如以下:

时间: 2024-11-08 23:19:28

推断5张扑克牌的组成的相关文章

Java 用LinkdeList实现52张扑克牌

用LinkdeList实现52张扑克牌(不含大小王)的洗牌功能.提示:花色 ,和数字分别用数组存储. import java.util.LinkedList; import java.util.Random; class Poker{ String color;//花色 String num;//数字 public Poker(String color,String num){ this.color = color; this.num = num; } @Override public Stri

请根据以上对话推断出张老师的生日是哪一天

小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗? 3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 小明说:如果我不知道的话,小强肯定也不知道小强说:本来我也不知道,但是现在我知道了小明说:哦,那我也知道了 请根据以上对话推断出张老师的生日是哪一天 解: 小明说:如果我不知道的话,小强肯定也不知道 --说明小明的是月

华为机试—5张扑克牌的组成

一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带 一对 3:三条带两张不相同数值的牌 4:两对 5:顺子 包括 10,J,Q,K,A 6:什么都不是 7:只有一对. c #include<iostream> #include<string> #include<cstdlib> using namespace std; int cmp(const void *a,const void *b) { r

判断5张扑克牌的组成

一副牌中发五张扑克牌给你,让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带一对 3:三条带两张不相同数值的牌 4:两对 5:顺子(包括10,J,Q,K,A) 6:什么都不是 7:只有一对 分析: 应该不包含大小王,另外J.Q.K.A分别相当于11.12.13.14,虽然从2到A一共是13张牌,但是为了方便对应,使用了一个包含15个元素的数组来记录每一个点数出现的次数(舍弃0号元素和1号元素). 为了记录发给你的5张牌,直接用整型肯定不行,不能接受J

【猜牌问题】甲乙都知道桌子的抽屉里有16张扑克牌: 红桃A、Q、4 黑桃J、8、4、2、7、3 草色K、Q、5、4、6 方块A、5 教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉甲,把这张牌的花色告诉乙。教授问:你们能推理出是什么牌吗? 甲:我不知道这张牌。 乙:我知道你不知道这张牌。 甲:现在我知道这张牌了。 乙:我也知道了。 请问:这张牌是什么牌?

甲乙都知道桌子的抽屉里有16张扑克牌: 红桃A.Q.4 黑桃J.8.4.2.7.3 草色K.Q.5.4.6 方块A.5 教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉甲,把这张牌的花色告诉乙.教授问:你们能推理出是什么牌吗? 甲:我不知道这张牌.乙:我知道你不知道这张牌.甲:现在我知道这张牌了.乙:我也知道了. 请问:这张牌是什么牌? 解: 教授告知甲点数,告知乙花色 人物 已知 未知 甲 A 红桃.方块 Q 红桃.草色 4 红桃.黑桃.草色 J 黑桃 8 黑桃 2 黑桃 7 黑桃 3 黑

理解面向对象编程---C#控制台实现52张扑克牌的分法

52张牌随机分给4个玩家,要求每个玩家的牌用一个一维数组表示. 我们采用模拟大法.初始化一副扑克牌,洗牌,发牌. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication43 { class Program { enum Suit { Spade, Heart, Di

给定N张扑克牌,设计一个洗牌算法

均匀洗牌即可 方法1: #include<stdio.h> #include<stdlib.h> #include<time.h> static int num = 54;//num为纸牌数目 //随机数发生器,产生[n,m)之间的随机数 int getRandNum(int n,int m) { if(n==m) { return n; } else if(n>m) { return -1; } time_t time1; srand(( unsigned in

张老师的生日

小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日 是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗? 3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 小明说:如果我不知道的话,小强肯定也不知道 小强说:本来我也不知道,但是现在我知道了 小明说:哦,那我也知道了 请根据以上对话推断出张老师的生日是哪一天 分析:小明所说我不知道是可以理解的,因为每个月都有2和3种选择

Java学习--扑克牌比大小的小游戏

实现:生成五十四张牌,然后进行洗牌,输入两名玩家,然后分别发两张牌,进行比较大小,两张牌中拥有较大一张牌的玩家获胜 Card.java代码如下: package com.cardgame; public class Card { String suit= new String(); String num = new String(); public Card(String suit ,String num){ this.suit=suit; this.num=num; } } Player.ja