4.骰子游戏

声明

可能本文章会有错误,希望各位读者看到后,记得回复留言,提醒我,以免误人子弟。本人菜鸡,还望各位大佬手下留情。文章是以我个人思路来写的,只能在学习的时候看,在比赛中,当然还是怎么快速准确的解答题目为标准

题目

我们来玩一个游戏。
同时掷出3个普通骰子(6个面上的数字分别是1~6)。
如果其中一个骰子上的数字等于另外两个的和,你就赢了。

下面的程序计算出你能获胜的精确概率(以既约分数表示)

public class Main
{
public static int gcd(int a, int b)
{
if(b==0) return a;
return gcd(b,a%b);
}

public static void main(String[] args)
{	
	int n = 0;
	for(int i=0; i<6; i++)
	for(int j=0; j<6; j++)
	for(int k=0; k<6; k++){
		if(________________________________) n++;   //填空位置
	}
	
	int m = gcd(n,6*6*6);
	System.out.println(n/m + "/" + 6*6*6/m);
}

}

仔细阅读代码,填写划线部分缺少的内容。

注意:不要填写任何已有内容或说明性文字。


分析

根据题目可以分析出,条件为其中一个骰子上的数字等于另外两个的和,而整个main函数内有个嵌套循环,可以直接联想到这三个for循环为遍历出每个骰子上的数字,而if条件恰好在循环中,所以大胆猜想这里的条件就是题目给的那个条件,那么n就为满足条件的次数。

既然是猜想,那我们继续往下看验证。又调用了gcd这个递归函数(递归不好的同学还是赶紧去补一下吧,这个还是有点重要的,起码你要了解些),由于博主的递归思想有限...还是跳过函数继续往下看,函数赋值给m,输出应该是获胜概率,却都除以了m,那么或许这个m就是n和666的最大公约数。

看完代码,似乎我们的猜想是正确的,emmm...似乎是这个样子的。

需要注意的是题目给的条件:如果其中一个骰子上的数字等于另外两个的和,你就赢了。而for循环是从0开始循环的,所以for循环中的每个变量(也就是骰子上的数)需要加1,那么我们就可以得出答案。

其实如果题目刷的够多,看函数名就可以知道gcd为求最大公约数,所以...还是...多刷题吧。


代码

//填空处:
i+j+2 == k+1 || j+k+2 == i+1 || i+k+2 == j+1
原文地址:https://www.cnblogs.com/drinkoo/p/8724352.html