高朗模数用数学大包

  • 本文关键字:高朗模 go
  • 更新时间 :
  • 英文 :


阅读文档- http://golang.org/pkg/math/big/

Mod将z设置为y != 0时的模x%y并返回z。如果y == 0,则会发生被零除的运行时恐慌。Mod实现欧几里得模(不像Go);

10%4 = 2,但我得到8与此(使用math/big包做同样的事情)- http://play.golang.org/p/_86etDvLYq

package main
import "fmt"
import "math/big"
import "strconv"
func main() {
    ten := new(big.Int)
    ten.SetBytes([]byte(strconv.Itoa(10)))
    four := new(big.Int)
    four.SetBytes([]byte(strconv.Itoa(4)))
    tenmodfour := new(big.Int)
    tenmodfour = tenmodfour.Mod(ten, four)
    fmt.Println("mod", tenmodfour)
}

我很可能弄错了。错在哪里?

这是因为SetBytes没有做你想的那样!用SetInt64代替。

ten := new(big.Int)
ten.SetBytes([]byte(strconv.Itoa(10)))
four := new(big.Int)
four.SetBytes([]byte(strconv.Itoa(4)))
fmt.Println(ten, four)
结果:

12592 52

事实上,12592%52 == 8

如果你想使用比int64允许你操作的更大的数字,你也可以使用SetString函数:

n := new(big.Int)
n.SetString("456135478645413786350", 10)

只是对julienc的答案的补充,如果你要使用SetBytes,你必须将数字转换为字节,如this:

func int2bytes(num int) (b []byte) {
    b = make([]byte, 4)
    binary.BigEndian.PutUint32(b, uint32(num))
    return
}
func main() {
    ten := new(big.Int)
    ten.SetBytes(int2bytes(10))
    four := new(big.Int)
    four.SetBytes(int2bytes(4))
    fmt.Println(ten, four)
    tenmodfour := new(big.Int)
    tenmodfour = tenmodfour.Mod(ten, four)
    fmt.Println("mod", tenmodfour)
}

相关内容

  • 没有找到相关文章

最新更新