我的功能有问题,我不明白为什么会这样.问题是:我有一个很大的数字,但当我try 进行除法运算时,我有零.

for {

        fmt.Println("number is", number)
        // key := number % 10
        key := number.Mod(number, big.NewInt(10))
        fmt.Println("key", key)
        // number = number / 10
        first := new(big.Int).Div(number, big.NewInt(10))
        fmt.Println("first ", first)

        number = first
        fmt.Println(number) //number = 0 always as a fisrt variable too
... }

退出示例为:

number is 6689502913449127057588118054090372586752746333138029810295671352301633557244962989366874165271984981308157637893214090552534408589408121859898481114389650005964960521256960000000000000000000000000000
key  0
first  0
0

数字正确,Mod操作似乎也正确.Div操作不是.重点是什么?如何计算大数的基本除法?

推荐答案

问题是这一行:

key := number.Mod(number, big.NewInt(10))

你调用number.Mod(),它是Int.Mod(),它是modifies,接收器是number,它将其设置为模0,所以在这之后,number将被置零.

您必须使用新的big.Int,就像您用于Div()操作一样:

key := new(big.Int).Mod(number, big.NewInt(10))

试试Go Playground码.

还要注意,有Int.DivMod()个同时执行这两个操作(Div()Mod()).

还要注意,为了加速循环,您应该创建并重用*big.Int个值,而不是在每次迭代中创建并丢弃它们.最简单的是创建和重用10:

var ten = big.NewInt(10)

还要为mod和div结果创建和重用值.

Go相关问答推荐

如何使用Promela建模语言对Golang RWLock进行建模

在不耗尽资源的情况下处理S3文件下载

将类型定义为泛型类型实例化

允许在 struct 中使用复合作为函数参数

Hugo错误:没有为此项目配置现有内容目录

Golang SDK for DynamoDB:ReturnValuesOnConditionCheckFailure在条件chcek失败发生时不返回条件的详细信息

exec的可执行决议.命令+路径

为什么 Go 对于长度为 100k 的切片使用的内存比长度为 100k 的数组要少?

Go安装成功但没有输出简单的Hello World

用 fork 替换 Go 依赖:...用于两个不同的模块路径

如何为ANTLR4目标Go调试监听器

同一文件上的多个 Arrow CSV 阅读器返回 null

甚至用天真的洗牌分配?

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

golang 中的可变参数函数

为什么 `append(x[:0:0], x...)` 将切片复制到 Go 中的新后备数组中?

使用无服务器工作流 go sdk 时出现间歇性 JSON 解组错误

如何将实际上是类型为 reflect.Int32 的类型切片的 interface{} 转换为 int32 的切片?

try 创建新的 etcdv3 客户端时出现pc error: code = Unavailable desc = error reading from server: EOF

Gin中测试模式有什么用