2017-12-31 128 views
1

Ich versuche, ein Stück big.Ints der ungeraden Zahlen zwischen 3 und der Quadratwurzel von i zu bekommen.big.Int Slice Neuschreiben selbst auf append()

Wenn ich den folgenden Code ausführen:

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) 
} 

ich die Ausgabe:

[11 11 11 11] 

Aber ich erwarte, dass die Ausgabe:

[3 5 7 9 11] 

Was kann ich tun, um dies zu beheben ?

Dank

Antwort

3

Sie haben ein Stück *big.Int, in dem Sie die gleichen Zeiger über speichern und immer wieder.

Stattdessen müssen Sie bei jeder Iteration eine Kopie von n speichern.

ersetzen:

divisorsOfPrime = append(divisorsOfPrime, n) 

mit:

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

By the way, ist dies *big.Int nicht spezifisch; Solange Sie mit Zeigern arbeiten, müssen Sie neue Objekte erstellen und Zeiger auf diese neuen Objekte speichern, nicht auf die ursprünglichen Objekte. Beachten Sie, dass n genau einmal zugewiesen wird.