前提・実現したいこと
プログラミングを始めたばかりの初心者です。
サイコロを3つ同時になげて目の和(n)になるのは何通りあるかのプログラムを書きました。
入力された値「n」になるパターンが何通りあるかをcountにしました。がうまくいきません。
nの範囲は 3<=n<=18です
です
例:n=3の時は(1,1,1)しかないのでcount=1
コードの説明
countは後で確率を出すときに使うかもしれないのでdouble型にしてます
与えられたnをdice配列に格納する。
dice[0]=1(1の目)、dice[1]=1(1の目)、dice[2]=n-2した値を初期値としていれる
dice[2]>6になるまで、dice[2]-=1 dice[1]=+1する
dice[2]=6かつdice[1]>6ならdice[0]=+1 dice[1]=+1として初期値を作る
///数える///
※ここがうまくいきません。
例1
n=4のとき
[1,1,2]→[1,2,1]→[2,1,1] 3通り
例2:
n=18のとき
[6,6,6] 1通り
数はあってると思うのですが、あっていませんでした。ソースコードで、条件式・配列の要素数を直書きしていてあまり良くない気がします。
修正したほうがいいと思うのですが、どのように書いたらキレイに書けるのでしょうか。
よろしくおねがいします。
追記
問題の説明文を修正しました。
nは3<=n<=18の範囲で入力されるものとします。
アルゴリズムがうまくいっていませんでしたので、修正案を教えていただけると助かります。
サイコロを4つに増やしてたときに、修正箇所が少なくて済むようにしたいです。
まずは3つで動くようにしたいです。
xが見にくいためnに変更しました
該当のソースコード
java
1 2import java.util.*; 3 4public class Main { 5 public static void main(String args[] ) { 6 Scanner sc = new Scanner(System.in); 7 int n= sc.nextInt();//目の和を入力 8 int[] dice={1,1,(n-2)};//サイコロ3つの配列 9 double count=1;//何通りあるかのカウント 10 //初期値 11 while (dice[2]>6){ 12 dice[2]-=1; 13 dice[1]+=1; 14 } 15 while (dice[1]>6){ 16 dice[0]+=1; 17 dice[1]-=1; 18 } 19 //通り数 20 while (dice[1]>6 || dice[2]>1){ 21 22 dice[2]-=1; 23 dice[1]+=1; 24 count++; 25 if (dice[2]==1 || dice[1]==6){ 26 int tmp=dice[1]; 27 dice[0]+=1; 28 dice[1]=dice[2]; 29 dice[2]=tmp-1; 30 if(dice[0]==7){ 31 break; 32 }else count++; 33 } 34 } 35 System.out.print(count); 36 } 37} 38
回答3件
あなたの回答
tips
プレビュー