Go 为什么这个节目人满为患?
我有一个小的golang程序,它计算第I个fibonnaci数,但是对于某些大数,它似乎会溢出,即使数组更改为Go 为什么这个节目人满为患?,go,integer-overflow,Go,Integer Overflow,我有一个小的golang程序,它计算第I个fibonnaci数,但是对于某些大数,它似乎会溢出,即使数组更改为int64类型。为什么会这样 package main import "fmt" func main() { fib(555) //prints a negative number } func fib(num int) { queue := []int{0, 1} for i := 0; i < num; i++ { next
int64
类型。为什么会这样
package main
import "fmt"
func main() {
fib(555) //prints a negative number
}
func fib(num int) {
queue := []int{0, 1}
for i := 0; i < num; i++ {
next := queue[0] + queue[1]
queue[0] = queue[1]
queue[1] = next
}
fmt.Println(queue[len(queue)-1])
}
主程序包
输入“fmt”
func main(){
fib(555)//打印一个负数
}
func fib(num int){
队列:=[]整数{0,1}
对于i:=0;i
因为第555个斐波那契数是
43516638122555047896418053731403947254072003726072973588566439865577574803495772577926560502782976758877570
因为第555个斐波那契数是 43516638122555047896418053731403947254072003726072973588566439865577574803495772577926560502782976758877570
即使对于int64也太大了。斐波那契序列变得非常大,非常快。您需要使用包来计算如此大的整数。翻译您的算法可以为我们提供:
queue := []*big.Int{big.NewInt(0), big.NewInt(1)}
for i := 0; i < num; i++ {
next := new(big.Int).Add(queue[0], queue[1])
queue[0] = queue[1]
queue[1] = next
}
queue:=[]*big.Int{big.NewInt(0),big.NewInt(1)}
对于i:=0;i
或者更简洁地说:
for i := 0; i < num; i++ {
queue[0].Add(queue[0], queue[1])
queue[0], queue[1] = queue[1], queue[0]
}
i:=0的;i
它将以555
作为输入输出以下数字:
70411399558423479787498867358975911087747238266614004739546108912183281780345203522889578644544982403856194431208467
(这与预期的555斐波那契数相差1,因为它的索引为0)斐波那契序列变得非常大,非常快。您需要使用包来计算如此大的整数。翻译您的算法可以为我们提供:
queue := []*big.Int{big.NewInt(0), big.NewInt(1)}
for i := 0; i < num; i++ {
next := new(big.Int).Add(queue[0], queue[1])
queue[0] = queue[1]
queue[1] = next
}
queue:=[]*big.Int{big.NewInt(0),big.NewInt(1)}
对于i:=0;i
或者更简洁地说:
for i := 0; i < num; i++ {
queue[0].Add(queue[0], queue[1])
queue[0], queue[1] = queue[1], queue[0]
}
i:=0的;i
它将以555
作为输入输出以下数字:
70411399558423479787498867358975911087747238266614004739546108912183281780345203522889578644544982403856194431208467
(这与预期的555斐波那契数相差1,因为它的索引为0)第555斐波那契数是
435166388122550478964180537314039472540722020372607297358856643986557748034957725779265605027829758677570
,它甚至不接近于一个整数,并且已经滚动了多次。int64
可以处理的最大整数值是什么?比如说,这与你的fib(100)
相比如何?奇怪的是,你竟然把这个问题标记为整数溢出
,却(似乎)不明白它的意思!555斐波那契数是4351663812255504779896418053731403947254072003726072973588566486557757480349725779265605027785297675867877570
,它甚至不接近于一个整数,并且已经滚动了多次。int64
能处理的最大整数值是多少?比如说,这与你的fib(100)
相比如何?奇怪的是,你竟然把这个问题标记为整数溢出
,却(似乎)不明白它的意思!为什么数组的类型是*big.Int
而不仅仅是big.Int
?可能是因为big.Int上的每个方法都需要指针接收器为什么数组的类型是*big.Int
而不仅仅是big.Int
?可能是因为big.Int上的每个方法都需要指针接收器