swift - 简单的 Swift Fibonacci 程序崩溃(Project Euler 2)

标签 swift exc-bad-instruction

我正在尝试解决欧拉计划的第二个问题。问题如下:


斐波那契数列中的每一项新项都是通过添加前两项而生成的。从 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 Int64UInt64 根本无法处理那么大的数字。后者的最大值可以达到 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/

相关文章:

xcode - Swift SpriteKit 中的子类化

swift - EXC_BAD_INSTRUCTION 错误

ios - 如何从左到右对齐 Collection View 单元格?

swift - 在 TableViewCell 中按下标签时关闭 View

ios - swift : Pass TableViewCell text to new ViewController's cell

swift - EXC_BAD_INSTRUCTION 错误

ios - EXC_BAD_INSTRUCTION(代码=EXC_1386,INVOP,子代码=0x0)错误

arrays - 使用数组值初始化新的数组元素

swift - 如何在UIwebview中保存缓存?

ios - 字体未通过 UILabel 扩展更改