高精度加减乘除

版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/82015717

为增进鲁棒代码能力和提高代码效率(卡常)能力,重构高精度模板

#include<bits/stdc++.h>
using namespace std;
 
struct Bignum
{
    #define LL long long
    #define siz 1005
    #define bit 1
    #define bitsiz 10
    LL s[siz],l,neg;
    Bignum(LL a=0)
    {
        neg = (a < 0);
        for(l=0;a;) s[l++] = a % bitsiz , a /= bitsiz;
        s[l] = 0;
    }
    void cin()
    {
        char ch;neg = l = 0;
        for(;!isdigit(ch=getchar());) if(ch == '-') neg = 1;
        for(s[l++]=ch-'0';isdigit(ch=getchar());s[l++]=ch-'0');
        for(int i=0;i<l-i-1;i++) swap(s[i],s[l-i-1]);
        s[l] = 0;
    }
    void cout()
    {
        if(neg) printf("-");
        for(int i=max(0ll,l-1);i>=0;i--) printf("%d",s[i]);
    }
    Bignum sum(const Bignum &B)const
    {
        Bignum ret(0);
        ret.l=max(l,B.l);
        int tmp;
        for(int i=0;i<ret.l;i++) 
        {
            ret.s[i+1] = 0;
            ret.s[i] += s[i] + B.s[i];
            if(ret.s[i] > 9)
                ret.s[i+1] += (tmp=ret.s[i] / 10),
                ret.s[i] -= tmp * 10;
        }
        for(;ret.s[ret.l];ret.l++)
        {
            ret.s[ret.l+1]=0;
            if(ret.s[ret.l]>9)
                ret.s[ret.l+1] += (tmp=ret.s[ret.l] / 10),
                ret.s[ret.l] -= tmp * 10;
        }
        return ret;
    }
    Bignum sub(const Bignum &B)const  // require abs(*this) >= abs(B)
    {
        Bignum ret(0);
        ret.l=max(l,B.l);
        int tmp;
        for(int i=0;i<ret.l;i++) 
        {
            ret.s[i+1] = 0;
            ret.s[i] += s[i] - B.s[i];
            if(ret.s[i] < 0)
                ret.s[i+1] += (tmp=ret.s[i] / 10 - (ret.s[i]%10!=0)),
                ret.s[i] -= tmp * 10;
        }
        for(;ret.l>=0 && !ret.s[ret.l];ret.l--);
        ret.l++;
        return ret;
    }
    bool absles(const Bignum &B)const
    {
        if(l!=B.l) return l < B.l;
        for(int i=l-1;i>=0;i--) 
            if(s[i]!=B.s[i])
                return s[i]<B.s[i];
        return 1;
    }
    Bignum operator +(const Bignum &B)const
    {
        Bignum ret;
        if(neg ^ B.neg)
        {
            if((*this).absles(B)) ret = B.sub(*this),ret.neg = B.neg;
            else ret = (*this).sub(B) , ret . neg = (*this).neg;
        }
        else
        {
            ret = (*this) . sum(B);
            ret . neg = neg;
        }
        if(ret . l == 0) ret.neg = 0;
        return ret;
    }
    Bignum operator -(const Bignum &B)const
    {
        Bignum ret(0);
        if(!(neg ^ B.neg))
        {
            if((*this).absles(B)) 
                ret = B.sub(*this),ret.neg = B.neg^1;
            else
                ret=(*this).sub(B) , ret . neg = (*this).neg;
        }
        else
        {
            ret = (*this).sum(B);
            ret . neg = neg;
        }
        if(ret . l == 0) ret.neg = 0;
        return ret;
    }
    Bignum operator *(const Bignum &B)const
    {
        Bignum ret(0);
        ret.neg = neg ^ B.neg;
        ret.l = l + B.l;
        int tmp;
        for(int i=0;i<l;i++)
            for(int j=0;j<B.l;j++)
                ret.s[i+j] += s[i] * B.s[j];
        for(int i=0;i<ret.l;i++)
            if(ret.s[i] > 9)
                ret.s[i+1] += (tmp = ret.s[i] / 10),
                ret.s[i] -= tmp * 10;
        for(;ret.s[ret.l];ret.l++)
            if(ret.s[ret.l] > 9)
                ret.s[ret.l+1] += (tmp = ret.s[ret.l] / 10),
                ret.s[ret.l] -= tmp * 10;
        for(;ret.l>=0 && !ret.s[ret.l];ret.l--);
        ret.l++;
        return ret;
    }
    pair<Bignum,int> operator /(const int &B)const
    {
        Bignum ret=*this;
        for(int i=ret.l-1;i>0;i--)
        {
            ret.s[i-1] += 10ll * (ret.s[i] % B);
            ret.s[i] /= B;
        }
        int res = ret.s[0] % B;
        ret.s[0]/=B;
        for(;ret.l >= 0 && !ret.s[ret.l];ret.l--);
        ret.l++;
        return make_pair(ret,res);
    }
}A;
int B;
int main()
{
    A.cin(),scanf("%d",&B);
    pair<Bignum,int>tmp = A/B;
    tmp.first.cout();
    printf("\n");
    printf("%d\n",tmp.second);
}

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/82015717