Оптимизация с использованием математической формулы
В предыдущих шагах мы итеративно генерировали последовательность Фибоначчи и проверяли, существует ли число, сравнивая его с каждым членом последовательности. Для очень больших чисел генерация всей последовательности может быть неэффективной. На этом этапе мы рассмотрим математическое свойство чисел Фибоначчи, которое позволяет проверить, является ли число числом Фибоначчи, не генерируя последовательность.
Положительное целое число x
является числом Фибоначчи тогда и только тогда, когда либо 5*x^2 + 4
, либо 5*x^2 - 4
является полным квадратом. Полный квадрат - это целое число, которое является квадратом другого целого числа (например, 4 является полным квадратом, так как это 2*2).
Мы создадим новую программу на Java, которая использует эту формулу для проверки, является ли число числом Фибоначчи.
-
Создайте новый файл с именем CheckFibonacci.java
в директории ~/project
.
-
Откройте файл 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
и возвращает true
, если n
является полным квадратом, и false
в противном случае. Она вычисляет целочисленный квадратный корень и проверяет, совпадает ли его квадрат с исходным числом.
public static boolean isFibonacci(int n)
: Эта функция реализует математическую формулу. Она вычисляет 5*n*n + 4
и 5*n*n - 4
и использует функцию isPerfectSquare
для проверки, является ли какой-либо из результатов полным квадратом. Оператор ||
означает "или".
- Метод
main
теперь запрашивает у пользователя число, вызывает функцию isFibonacci
и выводит результат.
-
Сохраните файл CheckFibonacci.java
.
-
Скомпилируйте новую программу в Терминале:
javac CheckFibonacci.java
-
Запустите скомпилированную программу:
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.
Этот метод намного более эффективен для проверки, является ли одно большое число числом Фибоначчи, по сравнению с генерацией последовательности до этого числа.