Сложение / вычитание двух числовых строк - PullRequest
0 голосов
/ 05 июля 2018

У меня есть две переменные с большими числами, заданными в виде строк:

var numA = "340282366920938463463374607431768211456"
var numB = "17014118346046923173168730371588410572"

Я хочу иметь возможность добавлять и вычитать такие большие строки в Go.

Я знаю, что мне нужно использовать math/big, но я все еще не могу на всю жизнь сообразить, как, поэтому любая помощь примера будет принята с благодарностью!

1 Ответ

0 голосов
/ 05 июля 2018

Вы можете использовать big.NewInt() для создания нового значения big.Int, инициализированного значением int64. Он возвращает вам указатель (*big.Int). В качестве альтернативы вы можете просто использовать встроенную функцию new() для выделения значения big.Int, которое будет 0, например: new(big.Int), или поскольку big.Int является типом структуры, простым составной литерал также будет делать: &big.Int{}.

Если у вас есть значение, вы можете использовать Int.SetString() для анализа и установки числа, заданного как string. Вы можете передать основание номера строки, и оно также возвращает вам значение bool, указывающее, успешно ли выполнен синтаксический анализ.

Затем вы можете использовать Int.Add() и Int.Sub() для вычисления суммы и разности чисел 2 big.Int. Обратите внимание, что Add() и Sub() записывают результат в получатель, чей метод вы вызываете, поэтому, если вам нужны неизменные числа (операнды), используйте другое значение big.Int для вычисления и сохранения результата.

См. Этот пример:

numA := "340282366920938463463374607431768211456"
numB := "17014118346046923173168730371588410572"

ba, bb := big.NewInt(0), big.NewInt(0)
if _, ok := ba.SetString(numA, 10); !ok {
    panic("invalid numA")
}
if _, ok := bb.SetString(numB, 10); !ok {
    panic("invalid numB")
}

sum := big.NewInt(0).Add(ba, bb)
fmt.Println("a + b =", sum)

diff := big.NewInt(0).Sub(ba, bb)
fmt.Println("a - b =", diff)

Вывод (попробуйте на Go Playground ):

a + b = 357296485266985386636543337803356622028
a - b = 323268248574891540290205877060179800884
...