我正在尝试解决欧拉计划的第二个问题。问题如下:
斐波那契数列中的每一项新项都是通过添加前两项而生成的。从 1 和 2 开始,前 10 项将是: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 考虑斐波那契数列中值不超过四百万的项,求偶数项的总和。
我想我已经编写了一个解决方案,但是当我尝试运行我的代码时,它使我的 Swift Playground 崩溃并给出了以下错误消息:
Playground execution aborted: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
var prev = 0
var next = 1
var num = 0
var sum = 0
for var i = 1; i < 400; i++ {
num = prev + next
if next % 2 == 0 {
sum += next
}
prev = next
next = num
}
print(sum)
奇怪的是,如果我将循环上的计数器设置为小于 93,它就可以正常工作。将变量名称显式设置为 Double 没有帮助。有人知道这是怎么回事吗?
最佳答案
这根本没有什么奇怪。你知道 400 斐波那契数有多大吗?
176023680645013966468226945392411250770384383304492191886725992896575345044216019675
Swift Int64
或 UInt64
根本无法处理那么大的数字。后者的最大值可以达到 18446744073709551615
- 甚至还没有接近。
如果将变量更改为 double ,它可以工作,但会不准确:
var prev : Double = 0
var next : Double = 1
var num : Double = 0
var sum : Double = 0
将会产生
2.84812298108489e+83
这有点接近实际值
1.76e+83
幸运的是,您不需要获得那么大的值。我建议不要编写 for 循环,而是编写 while 循环来计算下一个斐波那契数,直到满足中断条件,其值不超过四百万。
关于swift - 简单的 Swift Fibonacci 程序崩溃(Project Euler 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34707568/