• 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
    
  • 相关阅读:
    postgresql批量删除表
    Oracle迁移至PostgreSQL工具之Ora2Pg
    postgresql获取表最后更新时间(通过发布订阅机制将消息发送给应用程序)
    postgresql获取表最后更新时间(通过表磁盘存储文件时间)
    postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)
    postgresql源码编译安装(centos)
    Java 学习笔记(7)——接口与多态
    Java 学习笔记(6)——继承
    Java 学习笔记(4)——java 常见类
    Java 学习笔记(4)——面向对象
  • 原文地址:https://www.cnblogs.com/drinkoo/p/8724352.html
Copyright © 2020-2023  润新知