每个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小时的调试和发疯,请放心食用
最新评论