我被要求找出可以在我的系统上显示的最大斐波那契数。知道该怎么做吗?
4 回答
确定可以在我的系统上显示的最大斐波那契数
为此,您需要使用 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 项并且仍在运行。
int
Java中最大的斐波那契数:
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
。
If your goal is to find the largest fibonacci number that can be represented as an int
in Java, you could simply calculate the next number until it overflows:
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
}
Now obviously, your system is able to calculate a much higher number, for example by using a BigInteger. In that scenario, the limit will be one of:
- processing time
- available memory or
- (if you have a lot of memory and a lot of time) limitation of BigInteger which is backed by an
int[]
and therefore limited to an array size of 2^31.
Finally, it is probably worth saying that your problem can be better solved mathematically.
If you need to find the largest Fibonacci number that is less than a certain number N
, you can also use the rounding calculation:
phi^n / sqrt(5) < N
which gives you:
n < log(N x sqrt(5)) / log(phi)
Then you can calculate the right hand side part for your chosen N
, round it down to find n
, and calculate the corresponding Fibonacci number with:
F(n) = floor(phi^n / sqrt(5))
您可以计算 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;
}