链接:https://www.nowcoder.com/questionTerminal/2b101eacfaf641988eae013115015d54?toCommentId=1451496
来源:牛客网
牛牛与妞妞闲来无聊,便拿出扑克牌来进行游戏。游戏的规则很简单,两个人随机抽取四张牌,四张牌的数字和最大的取胜(该扑克牌总张数为52张,没有大小王,A=1,J=11,Q=12,K=13,每种数字有四张牌),现在两人已经分别亮出了自己的前三张牌,牛牛想要知道自己要赢得游戏的概率有多大。
输入描述:
输入包含两行,第一行输入三个整数a1,b1,c1(1≤a1,b1,c1≤13),表示牛牛亮出的扑克牌。第二行输入三个整数a2,b2,c2(1≤a2,b2,c2≤13),表示妞妞所亮出的扑克牌。
输出描述:
输出一个数字x(保留4位小数),表示牛牛获胜的概率。
示例1
输入
3 5 7 2 6 8
输出
0.3995
import java.util.*;
import java.text.DecimalFormat;
class newpoker{
public static void main(String[] args){
int[] poker = new int[14];
//用下标1-13对应poker[i]=4种花色
Arrays.fill(poker, 4);
//从所有的牌中抽掉已经选过的牌。
Scanner sc = new Scanner(System.in);
System.out.println("输入A的牌: ");
String a = sc.nextLine();
int suma = 0;
for(String x: a.split(" ")){
int tmp = Integer.parseInt(x);
poker[tmp]--;
suma += tmp;
}
System.out.println("输入B的牌: ");
String b = sc.nextLine();
int sumb = 0;
for(String x: b.split(" ")){
int tmp = Integer.parseInt(x);
poker[tmp]--;
sumb += tmp;
}
//无论输赢,一共有total种取法
int total = (52-6)*(52-6-1);
int diff = suma-sumb;
//能赢的情况有wintotal种
int wintotal = 0;
if(diff<0){
//初始情况。A从m开始取,B从1开始取
//(suma+m)-(sumb+1)=1
diff = Math.abs(diff);
int m = diff + 2;
//A取值相同时称为一类情况
//第一类情况B的取法,从1取到|diff|
//每取一个数字,不同的花色算作不同的情况所以剩几张有几种取法
//每类情况下B取值方式的和为bout
int bout = 0;
for(int i=1; i<=diff; i++)
bout += poker[i];
for( ; m<=13; m++){
int kind = poker[m]*bout;
if(diff<13){
diff++;
bout += poker[diff];
}
wintotal += kind;
}
}
else if(diff>0){
//初始情况,AB均可从1开始取
//第一类情况下,B最大能取到diff值
int bout = 0;
for(int i=1; i<=diff; i++)
bout += poker[i];
for(int m=1; m<=13; m++){
int kind = poker[m]*bout;
if(diff<13){
diff++;
bout += poker[diff];
}
wintotal += kind;
}
}
else{
//初始情况下,A可以从2开始取,B从1开始取
//每类情况下,B最大能取到m-1
int bout = poker[1];
for(int m=2; m<=13; m++){
int kind = poker[m]*bout;
bout += poker[m];
wintotal += kind;
}
}
// System.out.println("wintotal "+wintotal);
// System.out.println("total "+total);
double r = (float)wintotal/total;
DecimalFormat df = new DecimalFormat("#0.0000");
System.out.println("胜率为:"+df.format(r));
//System.out.printf("胜率为:%.4f\n", r);
}
}
~/test$ java newpoker
输入A的牌:
3 5 7
输入B的牌:
2 6 8
胜率为:0.3995