我有以下代码,可为n <47提供正确的值。
public static int fib(int n) { int nthTerm = 0; if (n == 2) nthTerm = 1; else { double goldenRatio = (1 + Math.sqrt(5)) / 2; nthTerm = (int) (Math.round(Math.pow(goldenRatio, n) - Math.pow(1 - goldenRatio, n)) / Math.sqrt(5)); if (n % 2 == 1 && n < 45) nthTerm++; } return nthTerm; }
n> 46的任何值都超出int范围。在n> 46的情况下,如何调整这种方法?
PS:我知道BigInteger,但不是很擅长,所以我也很感谢使用BigInteger的示例。
您可以将其用于将代码转换成BigInteger。
package your.pack import java.math.BigDecimal; import java.math.BigInteger; /** * Created on 3/6/16. */ public class Fibonacci { private static BigDecimal goldenRatio = new BigDecimal((1 + Math.sqrt(5)) / 2); private static BigDecimal goldenRatioMin1 = goldenRatio.subtract(BigDecimal.ONE); private static BigDecimal sqrt5 = new BigDecimal(Math.sqrt(5)); private static BigInteger fib(int n) { BigInteger nthTerm = new BigInteger("0"); if (n == 2) nthTerm = BigInteger.ONE; else { BigDecimal minResult = goldenRatio.pow(n).subtract(goldenRatioMin1.pow(n)); nthTerm = minResult.divide(sqrt5,0).toBigInteger(); if (n % 2 == 1 && n < 45){ nthTerm = nthTerm.add(BigInteger.ONE); } } return nthTerm; } private static int fib2(int n) { int nthTerm = 0; if (n == 2) nthTerm = 1; else { double goldenRatio = (1 + Math.sqrt(5)) / 2; nthTerm = (int) (Math.round(Math.pow(goldenRatio, n) - Math.pow(1 - goldenRatio, n)) / Math.sqrt(5)); if (n % 2 == 1 && n < 45) nthTerm++; } return nthTerm; } public static void main(String []args){ System.out.println( fib(47) ); } }
方法fib2是您的代码,fib被转换为BigInteger。干杯