压8位高精度模板

#define LL long long int
struct bignum
{
    LL num[MAXN] ;
    void init()
    {
        memset(num,0,sizeof num);
    }

    bool operator < (const bignum &a)const
    {
        if(num[0]!=a.num[0])return num[0]<a.num[0];
        for(int i=num[0];i>0;--i)
            if(num[i]!=a.num[i])
                return num[i]<a.num[i];
        return 0;
    }

    void operator += (const LL &a)
    {
        num[1]+=a ;
        for(int i=1;i<=num[0];++i)
        {
            num[i+1]+=num[i]/mod;
            num[i]%=mod;
        }
        while(num[num[0]+1]>0)++num[0];
    }

    bignum operator + (const LL a)const
    {
        bignum temp=*this;
        temp+=a;
        return temp ;
    }

    void operator += (const bignum &a)
    {
        num[0]=max(num[0],a.num[0]);
        for(int i=1;i<=num[0];++i)
        {
            num[i]+=a.num[i];
            num[i+1]+=num[i]/mod;
            num[i]%=mod;
        }
        while(num[num[0]+1]>0)++num[0];
    }

    bignum operator + (const bignum &a)const
    {
        bignum temp=*this;
        temp+=a;
        return temp;
    }

    void operator -= (const LL &a)
    {
        num[1]-=a;
        for(int i=1;num[i]<0&&i<=num[0];++i)
            while(num[i]<0)
            {
                num[i]+=mod;
                --num[i+1];
            }
        while(num[num[0]]<=0&&num[0]>0)--num[0];
    }

    bignum operator - (const LL &a)const
    {
        bignum temp=*this;
        temp-=a;
        return temp ;
    }

    void operator -= (const bignum &a)
    {
        for(int i=1;i<=num[0];++i)
        {
            num[i]-=a.num[i];
            while(num[i]<0)
            {
                num[i]+=mod ;
                --num[i+1];
            }
        }
        while(num[num[0]]<=0&&num[0]>0)--num[0];
    }

    bignum operator - (const bignum &a)const
    {
        bignum temp=*this;
        temp-=a;
        return temp;
    }

    void operator *= (const LL &a)
    {
        for(int i=1;i<=num[0];++i)
            num[i]*=a;
        for(int i=1;i<=num[0];++i)
        {
            num[i+1]+=num[i]/mod;
            num[i]%=mod;
        }
    }

    bignum operator * (const LL &a)const
    {
        bignum temp=*this;
        temp*=a;
        return temp;
    }

    bignum operator * (const bignum &a)const
    {
        bignum c;
        c.init();
        c.num[0]=num[0]+a.num[0]-1;
        for(int i=1;i<=num[0];++i)
            for(int j=1;j<=a.num[0];++j)
                c.num[i+j-1]+=num[i]*a.num[j];
        for(int i=1;i<=c.num[0];++i)
        {
            c.num[i+1]+=c.num[i]/mod;
            c.num[i]%=mod;
        }
        while(c.num[c.num[0]+1]>0)
        {
            ++c.num[0];
            c.num[c.num[0]+1]+=c.num[c.num[0]]/mod;
            c.num[c.num[0]]%=mod;
        }
        return c;
    }

    void operator *= (const bignum &a)
    {
        bignum c=*this;
        c=c*a;
        *this=c;
    }

    void operator /= (const LL &a)
    {
        for(int i=num[0];i>1;--i)
        {
            num[i-1]+=(num[i]%a*mod);
            num[i]/=a;
        }
        num[1]/=a;
        while(num[0]>0&&num[num[0]]<=0)--num[0];
    }

    bignum operator / (const LL &a)const
    {
        bignum temp=*this ;
        temp/=a;
        return temp;
    }

    void operator %= (const LL &a)
    {
        bignum temp=*this;
        temp=temp-temp/a*a;
        *this=temp;
    }

    bignum operator % (const LL &a)const
    {
        bignum temp=*this;
        temp%=a;
        return temp;
    }

    void operator /=(const bignum &a){
        bignum l ,m ,r =*this;
        l.init();
        l.num[0]=1 ;
        while(l<r)
        {
            m=(l+r+1)/2;
            if(*this<(a*m)) r=m-1;
            else l=m;
        }
        *this=l;
    }

    bignum operator / (const bignum &a)const
    {
        bignum temp=*this;
        temp/=a;
        return temp;
    }

    void operator %= (const bignum &a)
    {
        bignum c=*this;
        c=c-c/a*a;
        *this=c;
    }

    bignum operator % (const bignum &a)const
    {
        bignum c=*this;
        c%=a;
        return c;
    }

    void read()
    {
        scanf("%s",word);
        int len=strlen(word) ;
        for(int i=0;i<len;++i)
            num[(len-i-1)/8+1]=num[(len-i-1)/8+1]*10+word[i]-'0' ;
        num[0]=(len-1)/8+1 ;
    }
    void put()
    {
        printf("%I64d",num[num[0]]);
        for(int i=num[0]-1;i>0;--i)
            printf("%08I64d",num[i]);
        puts("");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值