【问题标题】:Splitting big.Int by digit按数字拆分 big.Int
【发布时间】:2022-11-14 16:09:11
【问题描述】:

我正在尝试将 big.Int 拆分为多个 int64s,以便每个都是较大数字的一部分,标准偏移量为 18 位。例如,给定以下输入值1234512351234088800000999,我希望得到以下输出:[351234088800000999, 1234512]

我已经知道我可以这样做以获得我想要的结果:

func Split(input *big.Int) []int64 {
    asStr := input.Text(10)
    strLen := len(asStr)
    length := int(math.Ceil(float64(strLen) / 18))

    ints := make([]int64, length)
    for i := 1; i <= length; i++ {
        start := strLen - (i * 18)
        end := start + 18
        if start < 0 {
            start = 0
        }

        ints[i-1], _ = strconv.ParseInt(asStr[start:end], 10, 64)
    }

    return ints
}

但是,我不喜欢使用字符串解析的想法,也不喜欢使用strconv。有没有办法直接使用big.Int 来做到这一点?

【问题讨论】:

    标签: go


    【解决方案1】:

    您可以使用DivMod 函数在此处执行您需要的操作:

    func Split(input *big.Int) []int64 {
        offset := big.NewInt(1e18)
    
        // (Optional) Make a copy of the input so it isn't changed.
        rest := new(big.Int)
        *rest = *input
    
        var ints []int64
        r := new(big.Int)
        for {
            rest.DivMod(rest, offset, r)
            ints = append(ints, r.Int64())
            if rest.BitLen() == 0 {
                break
            }
        }
        return ints
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 2013-07-18
      相关资源
      最近更新 更多