普通高精度模板

struct Bignum
{
	typedef long long ll;
    static const int BASE=100000000;
    static const int WIDTH=8;
    static const int maxn=5000+10;
    ll num[maxn];
    int len;
    
    Bignum() {len=1,num[1]=0;}
    Bignum(ll x)
    {
        len=0;
        do
        {
            num[++len]=x%BASE;
            x/=BASE;
        }while(x);
    }
	static int max(int x,int y) {return x>y?x:y;}
    void read()
    {
        char t[maxn];
        scanf("%s",t+1);
		int l=strlen(t+1);
        len=(l-1)/WIDTH+1;
        for (int i=1;i<=len;i++)
        {
            int end=l-(i-1)*WIDTH,start=max(1, end-WIDTH+1);
            num[i]=0;
            for (int j=start;j<=end;j++)
            	num[i]=num[i]*10+t[j]-'0';
        }
    }
    void deleteZero()
    {
        while(len>1&&!num[len])
            len--;
    }
    ll& operator [] (int i) {return num[i];}
    Bignum friend operator + (Bignum a,Bignum b)
    {
        Bignum res;
        res.len=max(a.len, b.len);
        for (int i=1;i<=res.len;i++)
            res[i]=0;
        for (int i=1;i<=a.len;i++)
            res[i]+=a[i];
        for (int i=1;i<=b.len;i++)
            res[i]+=b[i];
        for (int i=1;i<res.len;i++)
            if (res[i]>=BASE)
                res[i+1]++,res[i]-=BASE;
        if (res[res.len]>=BASE)
        {
            res[res.len+1]=1;
            res[res.len]-=BASE; 
            res.len++;
        } 
        return res;
    }
    Bignum friend operator - (Bignum a,Bignum b)
    {
    	Bignum res;
    	res.len=max(a.len, b.len);
    	for (int i=1;i<=res.len;i++)
            res[i]=0;
        for (int i=1;i<=a.len;i++)
            res[i]+=a[i];
        for (int i=1;i<=b.len;i++)
        {
			res[i]-=b[i];
			if (res[i]<0)
				res[i]+=BASE,res[i+1]--;
		}
		res.deleteZero();
		return res;
    }
    Bignum friend operator * (Bignum a,Bignum b)
    {
        Bignum res;
        res.len=a.len+b.len;
        for (int i=1;i<=res.len;i++)
            res[i]=0;
        for (int i=1;i<=a.len;i++)
            for (int j=1;j<=b.len;j++)
            {
            	res[i+j-1]+=a[i]*b[j];
                if (res[i+j-1]>=BASE)
                    res[i+j]+=res[i+j-1]/BASE,res[i+j-1]%=BASE;
            }
        if (res[res.len]>=BASE)
        {
            res[res.len+1]=res[res.len]/BASE;
            res[res.len]%=BASE; 
            res.len++;
        }
        res.deleteZero();
        return res;
    }
    Bignum friend operator / (Bignum a,const ll b)
    {
    	Bignum res=Bignum(0),base=Bignum(BASE);
    	ll last=0;
    	for (int i=a.len;i>=1;i--)
    	{
			last=last*BASE+a[i];
    		res=res*base+Bignum(last/b);
    		last%=b;
    	}
    	return res;
    }
	Bignum friend operator % (Bignum a,const ll b) {return a-a/b*b;}
	Bignum operator += (Bignum b) {return *this=*this+b;}
	Bignum operator -= (Bignum b) {return *this=*this-b;}
	Bignum operator *= (Bignum b) {return *this=*this*b;}
	Bignum operator /= (const ll b) {return *this=*this/b;}
    void print()
    {
        printf("%lld",num[len]);
        for (int i=len-1;i>=1;i--)
            printf("%08lld",num[i]);
    }
};
posted @ 2020-06-11 17:40  hkr04  阅读(94)  评论(0编辑  收藏  举报