高精 by jzzcjb

每个OIER都应该有一个属于自己的高精模板

                                                    ——沃兹·基·硕德华

 高精板子

支持 min,max,判==,比较大小,正数减负数,负数减正数,负数加正数,负数乘正数,高精除低精(含正负),int 转高精,高精读入输出(含正负)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct bign{
    int len;
    int num[15010];
    bool flag;
    bign(){len=1;flag=0;memset(num,0,sizeof num);}
    bign(int x){
        len=0;flag=(x<0);x=(x<0)?-x:x;
        while(x) num[++len]=x%10,x/=10;
    }
    void read(){
        memset(num,0,sizeof(num));
        char s[100001];cin>>s;len=strlen(s);
        if(s[0]=='-'){flag=1;len--;
            for(int i=1;i<=len;i++)
            num[i]=s[len-i+1]-'0';
        }
        else{flag=0;
            for(int i=1;i<=len;i++)
            num[i]=s[len-i]-'0';
        }
    }
    void write(){
        if(flag&&num[len]!=0) cout<<"-";
          for(int i=len;i>=1;i--) cout<<num[i];
    }
};
void Swap(bign &a,bign &b){
    bign c;
    c=a;a=b;b=c;
}
bool operator < (bign a,bign b){
    if(a.len!=b.len) return (a.len<b.len);
    for(int i=a.len;i>=1;i--)
    if(a.num[i]!=b.num[i]) return (a.num[i]<b.num[i]);
}
bool operator > (bign a,bign b){
    return (a<b)?0:1;
}
bool operator == (bign a,bign b){
    if(a.len!=b.len)return 0;
    for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
    return 1;
}
bign max(bign A,bign B){return (A>B)?A:B;}
bign operator - (bign a,bign b);
bign operator + (bign a,bign b){
    bign ans;
    if(a.flag&&b.flag) ans.flag=1;
    if(a.flag&&!b.flag){b.flag=1;return a-b;}
    if(!a.flag&&b.flag){a.flag=1;return b-a;}
    int i=1,x=0;
    while(i<=a.len||i<=b.len){
        ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
        x=ans.num[i]/10;ans.num[i]%=10;  i++;
    }
    ans.num[i]=x;
    if(!ans.num[i])i--;
    ans.len=i;
    return ans;
}
bign operator - (bign a,bign b){
    bign ans;
    if(a.flag&&b.flag) ans.flag=1;
    if(a.flag&&!b.flag){b.flag=1;return a+b;}
    if(!a.flag&&b.flag){a.flag=0;return a+b;}
    if(a==b)return ans;
    if(a<b) Swap(a,b),ans.flag^=1;
    for(int i=1;i<=a.len;i++){
        if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
        ans.num[i]=a.num[i]-b.num[i];
        if(ans.num[i]<0){
            ans.num[i]+=10; a.num[i+1]--;
        }
    }
    int len=max(a.len,b.len);
    while(ans.num[len]<=0&&len>1)len--;
    ans.len=len;
    return ans;
}
bign operator * (bign a,bign b){
    bign ans;
    ans.flag=a.flag^b.flag;
    int len=a.len+b.len;
    for(int i=1;i<=a.len;i++){
        int x=0;
        for(int j=1;j<=b.len;j++){
            ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
            x=ans.num[i+j-1]/10;
            ans.num[i+j-1]%=10;
        }
        ans.num[i+b.len]+=x;
    }
    while(!ans.num[len] && len>1)len--;
    ans.len=len;
    return ans;
}
bign operator /(bign a,int b){
    bign ans;
    ans.flag=a.flag^(b<0);
    b=b<0?-b:b;
    int len=a.len;
    for(int i=len,x=0;i>=1;i--){
        x=x*10+a.num[i];
        ans.num[i]=x/b;
        x%=b;
    }
    while(!ans.num[len]&&len>1) len--;
    ans.len=len;
    return ans;
}

int main(){
    A.read();B.read();
    B.write();
}

 经过总计超过24小时的调试和发疯,请放心食用

原文地址:https://www.cnblogs.com/jzzcjb/p/9762803.html