###前提・実現したいこと
コラッツ予想とは、任意の整数において、それが偶数ならば2で割り、奇数だったら3を掛けたものに1を足すという操作を繰り返して行くと、必ず最終的に1になるというものです。つまり、
f(n) = n/2 (nは偶数)
f(n) = 3n+1 (nは奇数)
今、2つの整数を入力として与えた時、その範囲内の全ての整数においてこの操作を繰り返し、その中で、1に辿り着くまでにかかった操作の回数が一番多かった時の回数を出力させる、ということをやりたいです。この時、一緒に入力した2整数も表示させたいです。
例えば入力を1と10とした場合は、1〜10の全ての数字に対して上記の操作を行い、1と、10と、その中で一番手順数が多かった回数、つまり3つの整数を出力させる、ということです。
###発生している問題・エラーメッセージ
実行しても一向に止まらないため、確認でnの値を出力させるようにしたら、
無限に1が出続けていましたが、理由が全く分かりません。
特に「1でないとき」という条件でwhileを回しているのに、1が出てて止まっていないというのが一番訳が分からないです。
###該当のソースコード
java
1import java.util.Scanner; 2import java.util.InputMismatchException; 3 4class Collatz { 5 public static void main (String[] args) { 6 Scanner scan = new Scanner(System.in); 7 System.out.println("Input 2 numeric values."); 8 9 try { 10 int countmax = 0; 11 int count = 1; 12 int a = scan.nextInt(); 13 int b = scan.nextInt(); 14 System.out.print(a+" "+b+" "); //入力した2整数を出力 15 16 //以下のループで第1引数の方が小さいことを前提としているため、第2引数の方が小さい場合は値を交換しておく 17 if(b<a) { 18 int tmp = b; 19 b = a; 20 a = tmp; 21 } 22 23 for(int n=a; n<=b; n++) { 24 while(n!=1) { 25 if(n%2==0) n/=2; 26 else n = 3*n+1; 27 System.out.println(n); //デバッグ用 これを足したら1が無限に出てくるようになりました 28 count++; 29 } 30 if(count>countmax) 31 countmax = count; //1に到達するのにかかった回数が一番多かったときの回数を覚えておく部分 32 count = 1; 33 } 34 35 System.out.println(countmax); 36 37 } catch(InputMismatchException e) { 38 System.out.println("Input must be type int."); 39 } 40 } 41}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/17 07:24