我正在嘗試將 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直接使用嗎?
uj5u.com熱心網友回復:
您可以使用該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 乘以它們在輸出中的位置應該等于輸入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535749.html
標籤:去
上一篇:如何知道變數名繼承goerror
