压位高精只有20pts ,mxqz /kk
查看原帖
压位高精只有20pts ,mxqz /kk
304550
black_trees楼主2021/8/29 14:34

RT,不知道哪里挂了。

球球大佬帮看看


#include<bits/stdc++.h>
using namespace std;

struct python{
    static const int si=1e4+10;
    static const int base=1e4;
    static const int bitn=4;
    int q[si];
    python(){
        for(register int i=1;i<=si-10;++i){
            q[i]=0;
        }
        q[0]=1;
    }
    void print(){
        printf("%d",q[q[0]]);
        for(register int i=q[0]-1;i;--i){
            printf("%0*d",bitn,q[i]);
        }
    }
    python & fix(){
        for(register int i=1;i<=q[0];++i){
            if(q[i]<0) q[i+1]--,q[i]+=base;
            q[i+1]+=q[i]/base,q[i]%=base;
            if(q[i+1]) q[0]=max(q[0],i+1);
        }
        while(q[0]>1 && q[q[0]]==0) q[0]--;
        return *this;
    }
    python & operator = (string &b){
        int l=b.size();
        int x=0,t=1,p=0;
        for(register int i=l-1;i>=0;--i){
            x=t*(b[i]-'0')+x;
            t*=10,++p;
            if(p==bitn) q[q[0]++]=x,x=p=0,t=1;
        }
        if(x) q[q[0]]=x;
        return fix();
    }
    bool operator < (const python b)const{
        if(q[0]!=b.q[0]) return q[0]<b.q[0];
        for(register int i=q[0];i>=1;--i){
            if(q[i]!=b.q[i]) return q[i]<b.q[i];
        }return false;
    }
    bool operator <= (const python b)const{
        if(q[0]!=b.q[0]) return q[0]<b.q[0];
        for(register int i=q[0];i>=1;--i){
            if(q[i]!=b.q[i]) return q[i]<b.q[i];
        }return true;
    }
    bool operator > (const python b)const{
        return b< *this;
    }
    bool operator >= (const python b)const{
        return b<= *this;
    }
    bool operator == (const python b)const{
        return !(*this<b) && !(*this>b);
    }
    bool operator != (const python b)const{
        return !(*this==b);
    }
    python operator + (const python b)const{
        python c;
        c.q[0]=max(q[0],b.q[0]);
        for(register int i=1;i<=c.q[0];++i){
            c.q[i]=q[i]+b.q[i];
        }
        return c.fix();
    }
    python operator + (const int &b)const{
        python c=*this;
        c.q[1]+=b;
        return c.fix();
    }
    python operator - (const python b)const{
        if(*this<b) puts("-1073741819 fool, check your code!");
        python c;
        c.q[0]=max(q[0],b.q[0]);
        for(register int i=1;i<=c.q[0];++i){
            c.q[i]=q[i]-b.q[i];
        }return c.fix();
    }
    python operator * (const python b)const{
		python c;
		c.q[0]=q[0]+b.q[0]-1;
		for(register int i=1;i<=q[0];i++){
            for(register int j=1;j<=b.q[0];j++){
                c.q[i+j-1]+=q[i]*b.q[j];
            }
        }return c.fix();
	}
	python operator * (const long long & b)const{
		python c=*this;
		for(register int i=1;i<=q[0];i++){
            c.q[i]*=b;
        }return c.fix();
	}
	python operator / (const python b)const{
		python c,rest;
		for(register int i=q[0];i>=1;--i){
			rest=rest*base+q[i]; // perhaps you should add long long
			//while(rest>=b) c.q[i]++,rest=rest-b;
			int l=0,r=base,ans=0;
			while(l<=r){
				int mid=(l+r)/2;
				if(rest>=b*mid) ans=mid,l=mid+1;
				else r=mid-1;
			}
			c.q[i]+=ans,rest=rest-b*ans;
        }return c.fix();
	}
	python operator % (const python b)const{
		python rest;
		rest=*this-(*this)/b*b;
		return rest.fix();
	}
};


int main(){
    python a,b,aa,bb;
    string s;cin>>s;
    a=aa=s;cin>>s;b=bb=s;
    (a+b).print();puts("");
    if(a<b) putchar('-'),(bb-aa).print();
    else (a-b).print();
    puts("");
    (a*b).print();puts("");
    (a/b).print();puts("");
    (a%b).print();puts("");
    return 0;
}
2021/8/29 14:34
加载中...