2017-12-31 168 views
1

私は、奇数のうちbig.Intsのスライスを3と平方根の間にあるiにしようとしています。私は次のコードを実行するとbig.Intスライスをappend()に書き直しています

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] 

を?

おかげ

答えて

3

あなたが何度も何度も同じポインタを格納する*big.Intのスライスを持っています。

代わりに、各繰り返しにnのコピーを保存する必要があります。

置き換えます

divisorsOfPrime = append(divisorsOfPrime, n) 

で:ところで

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

、これは*big.Intに固有ではありません。ポインタを扱っている限り、新しいオブジェクトを作成し、それらの新しいオブジェクトへのポインタを格納する必要があります。 nが正確に1回割り当てられていることに注意してください。

関連する問題