Определение проблемы: Вход: продукт - искомый продукт Выход: массив из 3 элементов: {F1, F2, результат}
Где F1 - первое число Фибоначчи, F2 - второе число Фибоначчи, результат равен1, если F1 * F2 = произведение, в противном случае: результат = 0
Эту проблему можно решить более эффективно, используя следующие формулы: 1. Прямая формула для получения n-го числа Фибоначчи.2. Прямая формула для получения индекса заданного числа Фибоначчи.
Вы можете получить соответствующие формулы и пояснения по следующей ссылке: https://en.wikipedia.org/wiki/Fibonacci_number
Идея состоит в том, чтобы получить индексчисло Фибоначчи: sqrt (product)
Затем мы можем перейти к следующему и предыдущему числам Фибоначчи и сравнить их продукты с данным продуктом
Это соответствующий код Java:
private static double phi = (1 + Math.sqrt(5)) / 2;
public static void main(String[] args) {
System.out.println(Arrays.toString(fibProd(800))); // [34, 55, 0]
System.out.println(Arrays.toString(fibProd(714))); // [21, 34, 1]
System.out.println(Arrays.toString(fibProd(15))); // [3, 5, 1]
System.out.println(Arrays.toString(fibProd(40))); // [5, 8, 1]
System.out.println(Arrays.toString(fibProd(2))); // [1, 2, 1]
System.out.println(Arrays.toString(fibProd(3))); // [2, 3, 0]
}
private static long[] fibProd(long product) {
long currentIndex = getFibIndex(Math.round(Math.sqrt(product)));
long currentElement = getFibElement(currentIndex);
long previousElement = getFibElement(currentIndex - 1);
long nextElement = getFibElement(currentIndex + 1);
int c1 = Long.compare(previousElement * currentElement, product);
if(c1 == 0) {
return new long[] {previousElement, currentElement, 1};
}
int c2 = Long.compare(currentElement * nextElement, product);
if(c2 == 0) {
return new long[] {currentElement, nextElement, 1};
}
if (c1 < c2) {
return new long[] {currentElement, nextElement, 0};
} else {
return new long[] {previousElement, currentElement, 0};
}
}
private static long getFibIndex(long item)
{
double m = item * Math.sqrt(5) + 0.5;
return Math.round(Math.log(m) / Math.log(phi));
}
private static long getFibElement(long index) {
return Math.round(Math.pow(phi, index) / Math.sqrt(5));
}