big.Int切片重写自己在append()

问题描述 投票:1回答:1

我试图在3和big.Ints的平方根之间得到一些奇数的i

当我运行以下代码时:

import (
    "fmt"
    "math/big"
)

func main() {
    i := big.NewInt(101)
    var divisorsOfPrime []*big.Int
    squareRoot := big.NewInt(0).Sqrt(i)
    for n := big.NewInt(3); n.Cmp(squareRoot) == -1; n.Add(n, big.NewInt(2)) {
        divisorsOfPrime = append(divisorsOfPrime, n)
    }
    fmt.Println(divisorsOfPrime)
}

我得到输出:

[11 11 11 11]

但我期待输出:

[3 5 7 9 11]

我该怎么做才能解决这个问题?

谢谢

go slice bigint
1个回答
3
投票

你有一片*big.Int,你在其中一遍又一遍地存储相同的指针。

相反,您需要在每次迭代时存储n的副本。

更换:

divisorsOfPrime = append(divisorsOfPrime, n)

附:

nCopy := new(big.Int).Set(n)
divisorsOfPrime = append(divisorsOfPrime, nCopy)

顺便说一句,这不是*big.Int特有的;只要您处理指针,就需要创建新对象并存储指向这些新对象的指针,而不是原始指针。请注意,n只分配了一次。

© www.soinside.com 2019 - 2024. All rights reserved.