다음은 주어진 숫자가 피보나치 수(Fibonacci number)인지 확인하는 Java 프로그램입니다.
예제
public class Demo{
static boolean perfect_square_check(int val){
int s = (int) Math.sqrt(val);
return (s*s == val);
}
static boolean fibonacci_num_check(int n){
return perfect_square_check(5*n*n + 4) || perfect_square_check(5*n*n - 4);
}
public static void main(String[] args){
for (int i = 6; i <= 17; i++)
System.out.println(fibonacci_num_check(i) ? i + " is a Fibonacci number" :
i + " is a not Fibonacci number");
}
}출력
6 is a not Fibonacci number
7 is a not Fibonacci number
8 is a Fibonacci number
9 is a not Fibonacci number
10 is a not Fibonacci number
11 is a not Fibonacci number
12 is a not Fibonacci number
13 is a Fibonacci number
14 is a not Fibonacci number
15 is a not Fibonacci number
16 is a not Fibonacci number
17 is a not Fibonacci number
Demo라는 이름의 클래스에는 정수 값을 매개변수로 받는 static boolean 함수 perfect_square_check가 정의되어 있습니다. 이 함수는 전달받은 값의 제곱근을 구해 정수형 변수에 저장한 뒤, 제곱근을 다시 곱한 결과가 원래 값과 같은지 비교합니다. 두 값이 일치하면 해당 숫자가 완전제곱수(perfect square)라는 의미로 true를 반환하고, 그렇지 않으면 false를 반환합니다.
다음으로 fibonacci_num_check라는 또 다른 static boolean 함수가 정의되며, 이 함수는 앞서 만든 완전제곱수 판별 함수를 호출합니다. 여기서 핵심은 피보나치 수의 잘 알려진 수학적 성질입니다. 어떤 숫자 n이 피보나치 수일 필요충분조건은 5n²+4 또는 5n²−4 중 하나가 완전제곱수라는 것입니다. 따라서 별도로 피보나치 수열을 생성하지 않고도 이 공식만으로 빠르게 판별할 수 있습니다.
main 함수에서는 시작 숫자(6)부터 끝 숫자(17)까지 반복문을 통해 하나씩 검사하면서, 각 숫자가 피보나치 수인지 아닌지에 따라 적절한 메시지를 출력합니다. 실행 결과를 보면 6~17 범위에서는 8과 13만 피보나치 수에 해당하는 것을 확인할 수 있습니다.