微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Golang实现Biginteger大数计算

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

package BigIntege



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

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐