Java 에서 숫자가 피보나치 수인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 주어진 숫자가 피보나치 수인지 확인하는 방법을 배우게 됩니다. 이를 달성하기 위해 세 가지 다른 접근 방식을 살펴볼 것입니다.

먼저, 지정된 항 수까지 피보나치 수열을 생성하는 방법을 배우게 됩니다. 그런 다음, 생성된 수열 내에 주어진 숫자가 존재하는지 확인하는 메서드를 구현할 것입니다. 마지막으로, 전체 수열을 생성하지 않고도 숫자가 피보나치 수인지 효율적으로 결정할 수 있는 수학 공식을 활용하여 확인 프로세스를 최적화할 것입니다.

피보나치 수열 생성

이 단계에서는 특정 항 수까지 피보나치 수열을 생성하는 Java 프로그램을 작성합니다. 피보나치 수열은 각 숫자가 이전 두 숫자의 합인 일련의 숫자이며, 일반적으로 0 과 1 로 시작합니다. 수열은 다음과 같습니다: 0, 1, 1, 2, 3, 5, 8, 13, 21 등.

새로운 Java 파일을 생성하고 이 수열을 생성하는 코드를 작성합니다.

  1. WebIDE 가 아직 열려 있지 않은 경우 엽니다. 기본적으로 ~/project 디렉토리에 있어야 합니다. 그렇지 않은 경우, 하단의 터미널을 열고 다음을 입력합니다.

    cd ~/project
    
  2. ~/project 디렉토리에 Fibonacci.java라는 새 파일을 생성합니다. 왼쪽의 파일 탐색기에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택한 다음 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;: 수열의 처음 두 항을 초기화합니다.
    • System.out.print(firstTerm + ", " + secondTerm);: 처음 두 항을 출력합니다.
    • for 루프는 후속 항을 계산하고 출력합니다.
    • int nextTerm = firstTerm + secondTerm;: 이전 두 항을 더하여 다음 항을 계산합니다.
    • 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.
    

생성된 피보나치 수열의 일부인지 확인하도록 프로그램을 성공적으로 수정했습니다.

수학 공식을 활용한 최적화

이전 단계에서는 피보나치 수열을 반복적으로 생성하고 각 항과 비교하여 숫자가 존재하는지 확인했습니다. 매우 큰 숫자의 경우 전체 수열을 생성하는 것은 비효율적일 수 있습니다. 이 단계에서는 수열을 생성하지 않고도 숫자가 피보나치 수인지 확인할 수 있는 피보나치 숫자의 수학적 속성을 탐구합니다.

양의 정수 x5*x^2 + 4 또는 5*x^2 - 4가 완전 제곱수일 경우에만 피보나치 수입니다. 완전 제곱수는 정수의 제곱인 정수입니다 (예: 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를 반환하는 도우미 함수입니다. 정수 제곱근을 계산하고 제곱하면 원래 숫자가 반환되는지 확인합니다.
    • public static boolean isFibonacci(int n): 이 함수는 수학 공식을 구현합니다. 5*n*n + 45*n*n - 4를 계산하고 isPerfectSquare 함수를 사용하여 두 결과 중 하나가 완전 제곱수인지 확인합니다. || 연산자는 "or"를 의미합니다.
    • 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.
    

이 방법은 단일 큰 숫자가 피보나치 수인지 확인하는 데 해당 숫자까지 수열을 생성하는 것보다 훨씬 더 효율적입니다.

요약

이 Lab 에서는 Java 에서 숫자가 피보나치 수인지 확인하는 방법을 배웠습니다. 먼저 간단한 반복적 접근 방식을 사용하여 특정 항 수까지 피보나치 수열을 생성하는 것으로 시작했습니다. 여기에는 피보나치 수열의 정의를 이해하고 항을 계산하고 출력하는 로직을 구현하는 작업이 포함되었습니다.

다음으로, 생성된 피보나치 수열 내에 주어진 숫자가 존재하는지 확인하는 방법을 탐구했습니다. 마지막으로, 전체 수열을 명시적으로 생성하지 않고도 숫자가 피보나치 수인지 효율적으로 결정하기 위해 수학 공식을 사용하는 최적화된 접근 방식에 대해 배웠습니다. 여기에는 피보나치 숫자의 속성을 이해하고 공식을 적용하여 확인을 수행하는 작업이 포함되었습니다.