1. 程式人生 > >4.骰子遊戲

4.骰子遊戲

需要 pre system 思想 函數 標準 了解 循環 註意

聲明

可能本文章會有錯誤,希望各位讀者看到後,記得回復留言,提醒我,以免誤人子弟。本人菜雞,還望各位大佬手下留情。文章是以我個人思路來寫的,只能在學習的時候看,在比賽中,當然還是怎麽快速準確的解答題目為標準

題目

我們來玩一個遊戲。
同時擲出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和66

6的最大公約數。

看完代碼,似乎我們的猜想是正確的,emmm...似乎是這個樣子的。

需要註意的是題目給的條件:如果其中一個骰子上的數字等於另外兩個的和,你就贏了。而for循環是從0開始循環的,所以for循環中的每個變量(也就是骰子上的數)需要加1,那麽我們就可以得出答案。

其實如果題目刷的夠多,看函數名就可以知道gcd為求最大公約數,所以...還是...多刷題吧。


代碼

//填空處:
i+j+2 == k+1 || j+k+2 == i+1 || i+k+2 == j+1

4.骰子遊戲