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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值