我正在尝试打印出低于四百万的Fibonacci序列的所有正数。
public static void main(String[] args) {
int n1 = 1;
int n2 = 2;
int n3 = 0;
while (n3 <= 4000000) {
n3 = n1 + n2;
if (n3 % 2 == 0) {
System.out.println(n3);
}
n1+=1;
n2+=1;
}
}
答案 0 :(得分:6)
你的逻辑错误。
如果您在调试器中单步执行此代码,您会看到n3
从不 甚至(您在{{1}中测试的内容}}),所以n3 % 2 == 0
条件永远不会成立。
现代处理器不需要很长时间就能达到400万(最多几十毫秒),因此程序似乎会立即终止。
答案 1 :(得分:3)
您的代码不会立即终止,它不会打印任何内容。 n1
从1开始,n2
开始为2,总和为3,这是奇数 - 因此不会打印。循环的每次迭代都会增加两个数字,从而产生另一个奇数结果,并再次打印任何数据。
while (n3 <= 4000000) {
n3 = n1 + n2;
System.out.println(n3);
n1 = n2;
n2 = n3;
}
答案 2 :(得分:2)
首先,您没有在循环结束时正确建立n1
和n2
。不要只为1
和n1
添加n2
。因为您只是递增n1
和n2
中的每一个,所以其中一个是奇数,其中一个是偶数。这使n3
变得奇怪,因此它永远不会打印出来。相反,请将n1
设置为n2
,然后将n2
设置为n3
。
其次,Fibonacci序列的所有数字都是正数,因此没有理由在打印上放置条件。无论如何,这种情况只打印偶数。删除if
,留下打印件。
答案 3 :(得分:0)
为什么我的代码会立即终止?(不适用于逻辑)
由于条件if (n3 % 2 == 0)
始终为假(n3
始终为奇数),因此您的代码未打印任何内容, 删除if条件并且不会立即终止< / em> 因为打印需要一些时间。
答案 4 :(得分:0)
你遇到的问题是你没有计算斐波纳契数。然而,即使你这样做,这应该执行得如此之快,你不会看到它计算结果。
您需要所有均匀的Fibonacci值。每三个斐波纳契都是如此,所以你不需要检查每一个。你可以做到
int a = 1;
int b = 1;
int c = a + b;
long sum = 0;
while (c < 4_000_000) {
sum += c;
a = b + c;
b = a + c;
c = a + b; // skip forward to the next even fibonacci
}
注意:这会丢弃一个%
,这是昂贵的并且有1/3的循环。