logo

Java の 3N+1 問題

3N+1問題 は、推測である (まだ証明されていない) 抽象的な数学の問題です。としても知られています コラッツ問題。 このセクションでは、3N+1 問題とその Java プログラムについて説明します。

タスクは、ユーザーから正の整数を読み取り、その結果を出力する Java プログラムを作成することです。 3N+1 その整数から始まるシーケンス。プログラムは、シーケンス内の用語の数も数えて出力する必要があります。

3N+1 シーケンスを見つける

正の整数 N を指定すると、N から始まる 3N+1 シーケンスを次のように定義します。

  • N が偶数の場合は、N を 2 で割ります。
  • N が奇数の場合は、N に 3 を掛けて 1 を加えます。
  • N が 1 になるまで、この方法で数値を生成し続けます。

数学的には、3N+1 問題は次のように定義できます。

Java の 3N+1 問題

例を通して問題文を理解しましょう。

仮定する、 N = 3 、これは奇数です。上記のルールに従って、N に 3 を掛けて 1 を加えると、N = 3*3+1 = 10 が得られます。したがって、N は偶数になります。ここで、N を 2 で割ります。N = 10/2 = 5 となります。N が 1 になるまでこのプロセスを続けます。したがって、3N+1 シーケンスは次のようになります。 3、10、5、16、8、4、2、1

3N+1 問題アルゴリズム

次の項を計算するには、プログラムは次の条件に応じて異なるアクションを実行する必要があります。 N または 奇数 。同じために、N が偶数か奇数かを決定する if ステートメントが必要でした。

残る 1 つの問題はカウントです。数えるということは、ゼロから始めて、数えるものができるたびに 1 を加えていくことを意味します。数を数えるには変数 (たとえば、数える) が必要です。

私たちはまだ最初のステップについて心配する必要があります。ユーザーから正の整数を取得するにはどうすればよいでしょうか?数値を読み取るだけの場合、ユーザーが負の数値またはゼロを入力する可能性があります。 N の値が負またはゼロの場合に何が起こるかを追跡すると、N の値が互換性のない 1 に等しくなることはないため、プログラムが永久に継続することがわかります。

この場合、問題はおそらく大したことではありませんが、一般的には確実なプログラムを作成するように努めるべきです。これを修正する 1 つの方法は、ユーザーが正の数を入力するまで数値を読み続けることです。

 Read a Positive integer N from the user while N is not positive: Print an error message; Read another value for N; Let count = 0; while N is not 1: if N is even: Compute N = N/2; else Compute N = 3 * N + 1; Output N; Add 1 to count; Output the count; 

最初の while ループは、必要に応じて、N が正の数の場合にのみ終了します。 N が正でない場合は、ユーザーに別の値を入力するように求めます。ユーザーが入力した 2 番目の数値も正でない場合、問題が発生します。 if ステートメントは 1 回だけ実行されるため、2 番目の入力数値はテストされません。

while ループでは、2 番目の数値が入力された後、コンピューターはループの先頭に戻り、2 番目の数値が正であるかどうかをテストします。そうでない場合は、ユーザーに 3 番目の番号を要求し、ユーザーが許容可能な入力を入力するまで番号の要求を続けます。

上記のアルゴリズムを Java プログラムに実装してみましょう。

3n+1 問題の Java プログラム

ThreeNPlusOne問題.java

 import java.util.Scanner; public class ThreeNPlusOneProblem { public static void main(String args[]) { //variable that denotes the starting point of the sequence int N; //variable to count the number of terms int count; Scanner sc=new Scanner(System.in); System.out.print(&apos;Enter the starting point for the sequence: &apos;); //reads an integer from the user N=sc.nextInt(); while (N <= 0 1 2="=" 0) { system.out.println('the starting point must be positive. please re-enter the number: '); n="sc.nextInt();" } count="0;" executes when is greater than while (n !="1)" if % 2; an odd number else * + 1; system.out.print(n '	'); increments variable by system.out.println(); system.out.println('there are '+count+' terms in sequence.'); end of main() class < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/java-tutorial/27/3n-1-problem-java-2.webp" alt="3N+1 Problem in Java"> <hr></=>