如果我在输出中检查我的代码中的数字 6 ,那么 8 是正确的。如果我 99 ,那么我有负数。这段代码出了什么问题:
package main
import (
"fmt"
)
var num = 94
func main() {
fmt.Printf("%d\n", fibo(num))
}
func fibo(num int) int{
a, b := 0, 1
for i := 0; i < num; i++ {
a, b = b, a + b
}
return a
}
答案 0 :(得分:2)
尝试将fibo
函数的返回类型从int
修改为uint64
,并将a
和b
声明为uint64
,如果输出int
,它就会溢出,这就是为什么你得到一个负值的结果:
func fibo(num int) uint64{
var a, b uint64 = 0, 1
for i := 0; i < num; i++ {
a, b = b, a + b
}
return a
}
然而,它仍然远不是完美的解决方案,因为指数高于93溢出的元素将会发生。
更新:适用于任意大数字。
因此,使用Go的big
包,您可以获得有效的fibo
功能(至少看起来像这样)。
试试这个:
package main
import (
"fmt"
"math/big"
)
var num int = 94
func main() {
fmt.Printf("%d\n", fibo(num))
}
func fibo(num int) *big.Int{
var a, b, t *big.Int = big.NewInt(0), big.NewInt(1), big.NewInt(0)
for i := 0; i < num; i++ {
t.Set(a)
a.Set(b)
b.Add(b, t)
}
return a
}
对于fibo(94)
,它将输出:
19740274219868223167
在Python
中看似合法,我用相同的逻辑得到相同的结果。
希望它有所帮助!