Java で数がフィボナッチ数であるかどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java で与えられた数がフィボナッチ数であるかどうかをチェックする方法を学びます。これを達成するための 3 つの異なるアプローチを探ります。

まず、指定された項数までのフィボナッチ数列を生成する方法を学びます。次に、生成された数列内に与えられた数が存在するかどうかをチェックするメソッドを実装します。最後に、数列全体を生成することなく数がフィボナッチ数であるかどうかを効率的に判断できる数式を利用して、チェックプロセスを最適化します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/BasicSyntaxGroup -.-> java/for_loop("For Loop") java/BasicSyntaxGroup -.-> java/math("Math") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/user_input("User Input") java/SystemandDataProcessingGroup -.-> java/math_methods("Math Methods") subgraph Lab Skills java/operators -.-> lab-559955{{"Java で数がフィボナッチ数であるかどうかをチェックする方法"}} java/if_else -.-> lab-559955{{"Java で数がフィボナッチ数であるかどうかをチェックする方法"}} java/for_loop -.-> lab-559955{{"Java で数がフィボナッチ数であるかどうかをチェックする方法"}} java/math -.-> lab-559955{{"Java で数がフィボナッチ数であるかどうかをチェックする方法"}} java/user_input -.-> lab-559955{{"Java で数がフィボナッチ数であるかどうかをチェックする方法"}} java/math_methods -.-> lab-559955{{"Java で数がフィボナッチ数であるかどうかをチェックする方法"}} end

フィボナッチ数列の生成

このステップでは、特定の項数までのフィボナッチ数列を生成する Java プログラムを作成します。フィボナッチ数列は、通常 0 と 1 から始まり、各数がその前の 2 つの数の和になる数列です。数列は次のようになります:0, 1, 1, 2, 3, 5, 8, 13, 21, など。

新しい Java ファイルを作成し、この数列を生成するコードを記述します。

  1. WebIDE が開いていない場合は開きます。デフォルトでは ~/project ディレクトリにいるはずです。そうでない場合は、下部のターミナルを開き、次のコマンドを入力します:

    cd ~/project
  2. ~/project ディレクトリに Fibonacci.java という名前の新しいファイルを作成します。左側のファイルエクスプローラーで右クリックして「新しいファイル」を選択し、Fibonacci.java と入力することで行えます。

  3. エディタで Fibonacci.java ファイルを開き、次の Java コードをコピーして貼り付けます:

    import java.util.Scanner;
    
    public class Fibonacci {
    
        public static void main(String[] args) {
    
            Scanner scanner = new Scanner(System.in);
            System.out.print("Enter the number of terms for Fibonacci sequence: ");
            int n = scanner.nextInt();
    
            if (n <= 0) {
                System.out.println("Please enter a positive integer.");
            } else if (n == 1) {
                System.out.println("Fibonacci sequence up to 1 term:");
                System.out.println("0");
            } else {
                System.out.println("Fibonacci sequence up to " + n + " terms:");
    
                int firstTerm = 0;
                int secondTerm = 1;
    
                System.out.print(firstTerm + ", " + secondTerm);
    
                for (int i = 3; i <= n; ++i) {
                    int nextTerm = firstTerm + secondTerm;
                    System.out.print(", " + nextTerm);
                    firstTerm = secondTerm;
                    secondTerm = nextTerm;
                }
                System.out.println(); // Print a newline at the end
            }
    
            scanner.close();
        }
    }

    このコードの主要部分をすばやく理解しましょう:

    • import java.util.Scanner;: ユーザー入力を読み取るための Scanner クラスをインポートします。
    • public class Fibonacci: Fibonacci という名前のメインクラスを宣言します。
    • public static void main(String[] args): プログラムの実行が開始されるメインメソッドです。
    • Scanner scanner = new Scanner(System.in);: コンソールからの入力を読み取るための Scanner オブジェクトを作成します。
    • System.out.print("Enter the number of terms... ");: ユーザーに項数の入力を促します。
    • int n = scanner.nextInt();: ユーザーからの整数入力を読み取り、変数 n に格納します。
    • if-else if-else ブロックは、項数 (n) の異なるケースを処理します。
    • int firstTerm = 0; int secondTerm = 1;: 数列の最初の 2 つの項を初期化します。
    • System.out.print(firstTerm + ", " + secondTerm);: 最初の 2 つの項を出力します。
    • for ループは、それ以降の項を計算して出力します。
    • int nextTerm = firstTerm + secondTerm;: 前の 2 つの項の和を計算して次の項を求めます。
    • firstTerm = secondTerm; secondTerm = nextTerm;: 次の反復のために firstTermsecondTerm を更新します。
    • scanner.close();: Scanner オブジェクトを閉じます。
  4. Fibonacci.java ファイルを保存します (Ctrl+S または Cmd+S)。

  5. 次に、ターミナルで javac コマンドを使用して Java プログラムをコンパイルします:

    javac Fibonacci.java

    エラーがなければ、このコマンドにより ~/project ディレクトリに Fibonacci.class ファイルが作成されます。

  6. 最後に、java コマンドを使用してコンパイルされたプログラムを実行します:

    java Fibonacci

    プログラムは項数の入力を求めます。数値 (例:10) を入力し、Enter キーを押すと、フィボナッチ数列が表示されます。

    Enter the number of terms for Fibonacci sequence: 10
    Fibonacci sequence up to 10 terms:
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34

フィボナッチ数列を生成する Java プログラムを正常に作成、コンパイル、実行しました!

数列内に数が存在するかチェックする

このステップでは、生成されたフィボナッチ数列内に与えられた数が存在するかどうかをチェックするように Java プログラムを修正します。これには、数列の項を生成する際にユーザーの入力した数と比較するロジックを追加する必要があります。

  1. WebIDE エディタで Fibonacci.java ファイルを開きます。

  2. 数列内に数が存在するかどうかをチェックするロジックを含むように main メソッドを修正します。既存の main メソッドを次のコードに置き換えます:

    import java.util.Scanner;
    
    public class Fibonacci {
    
        public static void main(String[] args) {
    
            Scanner scanner = new Scanner(System.in);
            System.out.print("Enter the number of terms for Fibonacci sequence: ");
            int n = scanner.nextInt();
    
            if (n <= 0) {
                System.out.println("Please enter a positive integer for the number of terms.");
                scanner.close();
                return; // Exit the program
            }
    
            System.out.print("Enter the number to check if it exists in the sequence: ");
            int checkNum = scanner.nextInt();
    
            System.out.println("Fibonacci sequence up to " + n + " terms:");
    
            int firstTerm = 0;
            int secondTerm = 1;
            boolean found = false;
    
            // Check the first two terms
            if (checkNum == firstTerm) {
                found = true;
            }
            System.out.print(firstTerm);
    
            if (n > 1) {
                if (checkNum == secondTerm) {
                    found = true;
                }
                System.out.print(", " + secondTerm);
            }
    
    
            // Generate and check subsequent terms
            for (int i = 3; i <= n; ++i) {
                int nextTerm = firstTerm + secondTerm;
                if (checkNum == nextTerm) {
                    found = true;
                }
                System.out.print(", " + nextTerm);
                firstTerm = secondTerm;
                secondTerm = nextTerm;
            }
            System.out.println(); // Print a newline at the end
    
            if (found) {
                System.out.println(checkNum + " exists in the Fibonacci sequence.");
            } else {
                System.out.println(checkNum + " does not exist in the Fibonacci sequence.");
            }
    
            scanner.close();
        }
    }

    変更点の詳細は次の通りです:

    • ユーザーにチェックしたい数を入力するように促すプロンプトを追加しました (System.out.print("Enter the number to check..."))。
    • この数を新しい変数 checkNum に読み込みました (int checkNum = scanner.nextInt();)。
    • ブール型の変数 foundfalse で初期化しました。この変数は、数が数列内に見つかったかどうかを追跡します。
    • ループの前に、checkNumfirstTerm または secondTerm と等しいかどうかをチェックします。
    • for ループ内で、nextTerm を計算した後、checkNumnextTerm と等しいかどうかをチェックします。等しい場合は、foundtrue に設定します。
    • ループが終了した後、if-else 文を使用して、found 変数の値に基づいて数が見つかったかどうかを出力します。
  3. Fibonacci.java ファイルを保存します。

  4. ターミナルで修正したプログラムをコンパイルします:

    javac Fibonacci.java
  5. コンパイルしたプログラムを実行します:

    java Fibonacci

    プログラムは現在、項数とチェックする数を求めます。

    例 1 (数が存在する場合):

    Enter the number of terms for Fibonacci sequence: 10
    Enter the number to check if it exists in the sequence: 8
    Fibonacci sequence up to 10 terms:
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34
    8 exists in the Fibonacci sequence.

    例 2 (数が存在しない場合):

    Enter the number of terms for Fibonacci sequence: 10
    Enter the number to check if it exists in the sequence: 10
    Fibonacci sequence up to 10 terms:
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34
    10 does not exist in the Fibonacci sequence.

生成されたフィボナッチ数列に数が含まれているかどうかをチェックするようにプログラムを正常に修正しました。

数式を用いた最適化

前のステップでは、フィボナッチ数列を反復的に生成し、各項と比較することで数が存在するかどうかをチェックしました。非常に大きな数の場合、数列全体を生成するのは非効率的です。このステップでは、数列を生成せずに数がフィボナッチ数であるかどうかをチェックできるフィボナッチ数の数学的性質を探ります。

正の整数 x がフィボナッチ数であるための必要十分条件は、5*x^2 + 4 または 5*x^2 - 4 が平方数であることです。平方数とは、整数の 2 乗になる整数のことです(例えば、4 は 2*2 なので平方数です)。

この公式を使用して数がフィボナッチ数であるかどうかをチェックする新しい Java プログラムを作成します。

  1. ~/project ディレクトリに CheckFibonacci.java という名前の新しいファイルを作成します。

  2. CheckFibonacci.java を開き、次の Java コードをコピーして貼り付けます:

    import java.util.Scanner;
    
    public class CheckFibonacci {
    
        // Function to check if a number is a perfect square
        public static boolean isPerfectSquare(int n) {
            if (n < 0) {
                return false;
            }
            int sqrt = (int) Math.sqrt(n);
            return (sqrt * sqrt == n);
        }
    
        // Function to check if a number is a Fibonacci number
        public static boolean isFibonacci(int n) {
            // n is Fibonacci if 5*n^2 + 4 or 5*n^2 - 4 is a perfect square
            return isPerfectSquare(5 * n * n + 4) ||
                   isPerfectSquare(5 * n * n - 4);
        }
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.print("Enter a number to check if it is a Fibonacci number: ");
            int num = scanner.nextInt();
    
            if (isFibonacci(num)) {
                System.out.println(num + " is a Fibonacci number.");
            } else {
                System.out.println(num + " is not a Fibonacci number.");
            }
    
            scanner.close();
        }
    }

    このコードの新しい部分を見てみましょう:

    • public static boolean isPerfectSquare(int n): これは、整数 n を引数に取り、n が平方数であれば true を返し、そうでなければ false を返すヘルパー関数です。整数の平方根を計算し、それを 2 乗した結果が元の数と等しいかどうかをチェックします。
    • public static boolean isFibonacci(int n): この関数は数学的公式を実装しています。5*n*n + 45*n*n - 4 を計算し、isPerfectSquare 関数を使用してどちらかの結果が平方数であるかどうかをチェックします。|| 演算子は「または」を意味します。
    • main メソッドは、ユーザーに数を入力するように促し、isFibonacci 関数を呼び出し、結果を出力します。
  3. CheckFibonacci.java ファイルを保存します。

  4. ターミナルで新しいプログラムをコンパイルします:

    javac CheckFibonacci.java
  5. コンパイルしたプログラムを実行します:

    java CheckFibonacci

    プログラムは数を入力するように求めます。数(例えば、13)を入力し、Enter キーを押します。

    例 1(フィボナッチ数の場合):

    Enter a number to check if it is a Fibonacci number: 13
    13 is a Fibonacci number.

    例 2(フィボナッチ数ではない場合):

    Enter a number to check if it is a Fibonacci number: 10
    10 is not a Fibonacci number.

この方法は、数列をその数まで生成するよりも、単一の大きな数がフィボナッチ数であるかどうかをチェックするのにはるかに効率的です。

まとめ

この実験では、Java で数がフィボナッチ数であるかどうかをチェックする方法を学びました。まず、単純な反復アプローチを使用して、ある項数までのフィボナッチ数列を生成しました。これには、フィボナッチ数列の定義を理解し、項を計算して出力するロジックを実装することが含まれていました。

次に、生成されたフィボナッチ数列内に与えられた数が存在するかどうかをチェックする方法を探りました。最後に、数列全体を明示的に生成せずに数がフィボナッチ数であるかどうかを効率的に判断するための数学的公式を用いた最適化アプローチについて学びました。これには、フィボナッチ数の性質を理解し、チェックを行うために公式を適用することが含まれていました。