前几天初学java时碰到的一道java基础编程题,稍微写了一下。(才识浅薄 轻喷)
题目如下:
给定一副扑克牌,去掉大王和小王后共52张牌,其中A K Q J对应的数值分别为1、13、12、11。其他牌按照牌面数值大小。
不断重复随机从抽取4张牌,直到所有牌抽取完毕。
每次计算4张牌的牌面数值之和,统计和为24的次数。
输出格式:
提示: int x = (int)(Math.random()*n); x是[0,n)之间的随机整数,包括0,不包括n。
过程详解:
据题意这是一道不放回取出的排列组合,根据提示可以用随机数来进行取值,用数组解题。分析可得,取出共13组手牌,每组4张。
1.创建一个扑克牌牌堆(不需要打散)
2.利用随机数来进行取牌,每次取出一张
3.将取出的那张与牌堆顶部的交换,置入手牌
4.压缩牌堆,牌堆数量减一
5.在此基础上重复操作,直至取完
取牌过程图如下:
具体细节见代码:
public class Main {
static int AllCount=0;//标记24点的组个数
static int poker[]=
{1,2,3,4,5,6,7,8,9,10,11,12,13,
1,2,3,4,5,6,7,8,9,10,11,12,13,
1,2,3,4,5,6,7,8,9,10,11,12,13,
1,2,3,4,5,6,7,8,9,10,11,12,13};//扑克牌牌堆;
public static void main(String[] args) {
System.out.print("开始:"+"\n");
System.out.print("---------------"+"\n");
int[][] arr = new int[13][4];//共有13个组,4张一组
GetRandom(arr);//取牌
Count(arr);//输出
}
public static void GetRandom(int arr[][])//抽牌
{
int n=51;//牌堆顶
int temp=0;
for (int i=0;i<13;i++)
{
for(int j=0;j<4;j++)
{
temp= (int)(Math.random()*n);//在剩余的牌堆里随机抽牌
arr[i][j]=poker[temp];
poker[temp]=poker[n];//顶部的牌交换,并置入手牌
n--;//牌数量减一
}
}
}
public static void Count(int arr[][])//输出
{
for (int i =0;i<13;i++)
{
int sum=0;
for (int j=0;j<4;j++)
{
sum =sum+arr[i][j];
}
String jie=" ";
if(sum==24)//后缀yes
{
AllCount++;
jie="YES";
}
System.out.print(arr[i][0]+"+"+arr[i][1]+"+"+arr[i][2]+"+"+arr[i][3]+"="+sum+" "+jie+"\n");
}
System.out.print("----------------"+"\n");
System.out.print("一共有"+AllCount+"组24");
}
}