我被要求确定可以在我的系统上显示的最大的斐波纳契数,我想知道如何做到这一点..
这是我确定第n个斐波纳契数
的简单应用程序import java.util.Scanner;
public class FibonacciTest
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
System.out.printf("please enter the nth fibonacci number: ");
int n = input.nextInt();
System.out.printf("%d\n", fibonacci(n));
}// end main
public static int fibonacci(int n)
{
// determines nth fibonacci number
int fib = 1;
int temp = 0;
if (n == 1)
return 0;
else
{
for (int i = 2; i < n; i++)
{
int last = fib;
fib += temp;
temp = last;
}
return fib;
}
}// end fibonacci
}
答案 0 :(得分:7)
确定可在我的系统上显示的最大斐波那契数
为此您需要使用BigInteger
运行此操作直到您的应用程序停止,因为资源已耗尽。
public static void main(String... args) {
BigInteger a = BigInteger.ONE;
BigInteger b = BigInteger.ONE;
String last = null;
try {
for (long count = 1; ; count++) {
BigInteger c = a.add(b);
last = c.toString();
a = b;
b = c;
if (count % 10000 == 0)
System.out.println("... " + count);
}
} catch (Throwable e) {
System.out.println("The largest value which was calculated was");
System.out.println(last);
}
}
我会首先尝试使用少量内存,例如-mx16m
更新:即使限制为16 MB,它也计算了13K项并仍在运行。
答案 1 :(得分:5)
Java中最大的int
斐波纳契数:
public class FibonacciTest
{
public static void main(String[] args)
{
System.out.printf("%d\n", largestFibonacciInt());
}
public static int largestFibonacciInt()
{
int temp;
int last = 1;
int fib = 1;
while (fib + last > fib) {
temp = fib;
fib += last;
last = temp;
}
return fib;
}
}
您也可以使用long
执行此操作,只需替换int
的所有匹配项。
答案 2 :(得分:2)
如果您的目标是找到可以在Java中表示为int
的最大斐波那契数,您可以直接计算下一个数字,直到它溢出:
public static void main(String[] args) {
System.out.println("Largest integer Fibonacci number: " + maxFibonacci());
}
public static int maxFibonacci() {
int n = Integer.MAX_VALUE;
int fib = 1;
int temp = 0;
for (int i = 2; i < n; i++) {
int last = fib;
fib += temp;
if (fib < 0) return last; //overflow, we are done
temp = last;
}
return 0; //unreachable
}
很明显,您的系统可以计算更高的数字,例如使用BigInteger。在这种情况下,限制将是以下之一:
int[]
支持,因此限制为2 ^ 31的数组大小。最后,值得一提的是,您的问题可以通过数学方法更好地解决。
如果您需要找到小于某个数字N
的最大斐波纳契数,您还可以使用the rounding calculation:
phi^n / sqrt(5) < N
给你:
n < log(N x sqrt(5)) / log(phi)
然后,您可以计算所选N
的右侧部分,将其向下舍入以查找n
,并计算相应的斐波纳契数:
F(n) = floor(phi^n / sqrt(5))
答案 3 :(得分:0)
您可以计算100K甚至更多。 对于计算机中的100k,计算结果只需1.4s。
private static final Map<Integer, BigInteger> fbNumbers = new HashMap<>();
public static void main(String[] args) {
fbNumbers.put(0, BigInteger.valueOf(1));
fbNumbers.put(1, BigInteger.valueOf(1));
long start = System.currentTimeMillis();
System.out.println(fbCalculationForBigNumbers(100000));
System.out.println(String.format("%d ms", System.currentTimeMillis() - start));
}
private static BigInteger fbCalculationForBigNumbers(int num) {
return IntStream.rangeClosed(0, num).mapToObj(i -> fbCalculation(i)).max((x,y) -> x.compareTo(y)).get();
}
private static BigInteger fbCalculation(int num) {
if (fbNumbers.containsKey(num)) {
return fbNumbers.get(num);
}
BigInteger result = fbCalculation(num - 1).add(fbCalculation(num - 2));
fbNumbers.put(num, result);
return result;
}