猛跑小猪
问题定义:输入:产品 - 想要的产品输出:3 个元素的数组:{F1,F2,结果}其中 F1 是第一个斐波那契数,F2 是第二个斐波那契数,如果 F1 * F2 = 乘积,则结果等于 1,否则:结果 = 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)); }