侧边栏壁纸
  • 累计撰写 71 篇文章
  • 累计创建 87 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

Golang实现Biginteger大数计算

KunkkaWu
2022-06-09 / 0 评论 / 3 点赞 / 2,217 阅读 / 306 字 / 正在检测是否收录...

Golang中的big.Int库支持大数计算,基于这个库封装了一层Bitinteger,支持字符串类型的大数,加减乘除等计算。 其他计算可以参考基于big.Int来实现。

package BigInteger

import (
	"fmt"
	"math/big"
)

const DecBase = 10

// BigInteger wrapper for big.Int
type BigInteger struct {
	Value *big.Int
}

func NewBigInteger(value string) *BigInteger {
	var val big.Int
	newVal, ok := val.SetString(value, DecBase)
	if ok {
		return &BigInteger{
			Value: newVal,
		}
	}
	return NewZeroBigInteger()
}

func NewZeroBigInteger() *BigInteger {
	return &BigInteger{
		Value: big.NewInt(0),
	}
}

func (x *BigInteger) Add(y *BigInteger) {
	x.Value = x.Value.Add(x.Value, y.Value)
}

func (x *BigInteger) Sub(y *BigInteger) {
	x.Value = x.Value.Sub(x.Value, y.Value)
}

// Cmp compares x and y and returns:
//
//   -1 if x <  y
//    0 if x == y
//   +1 if x >  y
func (x *BigInteger) Cmp(y *BigInteger) int {
	return x.Value.Cmp(y.Value)
}

func (x *BigInteger) String() string {
	return x.Value.String()
}

// Sum 加法
func Sum(x, y *BigInteger) *BigInteger {
	z := NewZeroBigInteger()
	z.Add(x)
	z.Add(y)
	return z
}

// Sub 减法
func Sub(x, y *BigInteger) *BigInteger {
	z := NewBigInteger(x.String())
	z.Sub(y)
	return z
}

// Mul 惩罚
func Mul(x, y *BigInteger) *BigInteger {
	t := NewZeroBigInteger()
	z := t.Value.Mul(x.Value, y.Value)
	return &BigInteger{Value: z}
}

// Div 除法
func Div(x, y *BigInteger) *BigInteger {
	t := NewZeroBigInteger()
	z := t.Value.Div(x.Value, y.Value)
	return &BigInteger{Value: z}
}

func isValidBigInt(val string) error {
	_, ok := big.NewInt(0).SetString(val, 10)
	if !ok {
		return fmt.Errorf("parse string to big.Int failed, actual: %s", val)
	}
	return nil
}

3

评论区