亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

按數字拆分 big.Int

按數字拆分 big.Int

Go
慕后森 2023-03-15 14:44:55
我正在嘗試將 a 拆分big.Int為多個int64s,以便每個都是較大數字的一部分,標準偏移量為 18 位。例如,給定以下輸入值1234512351234088800000999,我希望得到以下輸出:[351234088800000999, 1234512]。對于負數,我希望所有部分都是負數(即-1234512351234088800000999produces [-351234088800000999, -1234512])。我已經知道我可以這樣做以獲得我想要的結果:func Split(input *big.Int) []int64 {    const width = 18    asStr := in.Coefficient().Text(10)    strLen := len(asStr)    offset := 0    if in.IsNegative() {        offset = 1    }    length := int(math.Ceil(float64(strLen-offset) / width))    ints := make([]int64, length)    for i := 1; i <= length; i++ {        start := strLen - (i * width)        end := start + width        if start < 0 || (start == 1 && asStr[0] == '-') {            start = 0        }        ints[i-1], _ = strconv.ParseInt(asStr[start:end], 10, 64)        if offset == 1 && ints[i-1] > 0 {            ints[i-1] = 0 - ints[i-1]        }    }    return ints}但是,我不喜歡使用字符串解析的想法,也不喜歡使用strconv. 有什么方法可以直接使用嗎big.Int?
查看完整描述

1 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

您可以使用該DivMod函數在這里執行您需要的操作,并特別注意處理負數:


var offset = big.NewInt(1e18)


func Split(input *big.Int) []int64 {

    rest := new(big.Int)

    rest.Abs(input)


    var ints []int64

    r := new(big.Int)

    for {

        rest.DivMod(rest, offset, r)

        ints = append(ints, r.Int64() * int64(input.Sign()))

        if rest.BitLen() == 0 {

            break

        }

    }

    return ints

}

將每個輸出乘以input.Sign()確保如果輸入為負,則每個輸出將為負。輸出值的總和乘以 1e18 乘以它們在輸出中的位置應該等于輸入。


查看完整回答
反對 回復 2023-03-15
  • 1 回答
  • 0 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號