声明
可能本文章会有错误,希望各位读者看到后,记得回复留言,提醒我,以免误人子弟。本人菜鸡,还望各位大佬手下留情。文章是以我个人思路来写的,只能在学习的时候看,在比赛中,当然还是怎么快速准确的解答题目为标准。
题目:
我们来玩一个游戏。
同时掷出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