斐波那契负数
negative number in fibonacci
如果我在输出中检查我的代码是否有 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
}
尝试将 fibo
函数的 return 类型从 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
我用相同的逻辑得到相同的结果。
希望对您有所帮助!
如果我在输出中检查我的代码是否有 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
}
尝试将 fibo
函数的 return 类型从 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
我用相同的逻辑得到相同的结果。
希望对您有所帮助!