我正试图解决欧拉计划的第二个问题。问题如下:
fibonacci序列中的每个新项都是通过添加前两个项生成的。从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89,…
通过考虑fibonacci序列中值不超过400万的项,求出偶数项的和。
我想我已经写了一个解决方案,但是当我试图运行我的代码时,它崩溃了我的swift操场,并给我这个错误信息:
操场执行中止:执行被中断,原因:exc_bad_指令(代码=exc_i386_invop,子代码=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

swiftInt64UInt64根本无法处理这么大的数字。后者可以上升到18446744073709551615的最大值-甚至不关闭。
如果将变量更改为双倍,则会起作用,但不准确:
var prev : Double = 0
var next : Double = 1
var num : Double = 0
var sum : Double = 0

会屈服的
2.848122981108489E+83
有点接近
1.76E+83
幸运的是你不需要得到那么大的价值。我建议不要编写for循环,而是编写一个while循环来计算下一个fibonacci数,直到满足其值不超过400万的中断条件。

关于swift - 简单的Swift Fibonacci程序崩溃(项目Euler 2),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34707568/

10-13 04:29