高精度 模板 压代码 精简版
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 struct bign{ 6 int len; 7 int num[1501]; 8 bool flag; 9 bign(){len=1;flag=0;memset(num,0,sizeof num);} 10 bign(int x){ 11 if(!x)return; 12 len=0; 13 while(x)num[++len]=x%10;x/=10; 14 } 15 }; 16 bool operator < (bign a,bign b){ 17 if(a.len<b.len)return 1; 18 if(a.len>b.len)return 0; 19 for(int i=a.len;i>=1;i--)if(a.num[i]>b.num[i])return 0; 20 return 1; 21 } 22 bool operator == (bign a,bign b){ 23 if(a.len!=b.len)return 0; 24 for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0; 25 return 1; 26 } 27 bign operator + (bign a,bign b){ 28 bign ans; 29 int i=1,x=0; 30 while(i<=a.len || i<=b.len){ 31 ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]); 32 x=ans.num[i]/10;ans.num[i]%=10; i++; 33 } 34 ans.num[i]=x; 35 if(!ans.num[i])i--; 36 ans.len=i; 37 return ans; 38 } 39 bign operator * (bign a,bign b){ 40 bign ans; 41 int len=a.len+b.len; 42 for(int i=1;i<=a.len;i++){ 43 int x=0; 44 for(int j=1;j<=b.len;j++){ 45 ans.num[i+j-1]+=(a.num[i]*b.num[j]+x); 46 x=ans.num[i+j-1]/10; 47 ans.num[i+j-1]%=10; 48 } 49 ans.num[i+b.len]+=x; 50 } 51 while(!ans.num[len] && len>1)len--; 52 ans.len=len; 53 return ans; 54 } 55 bign operator - (bign a,bign b){ 56 bign ans; 57 if(a==b)return ans; 58 if(b<a){ 59 for(int i=1;i<=a.len;i++){ 60 if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--; 61 ans.num[i]=a.num[i]-b.num[i]; 62 if(ans.num[i]<0){ 63 ans.num[i]+=10; a.num[i+1]--;//向a的高位借位 64 } 65 } 66 } 67 else{ 68 ans.flag=1;// this number(I mean the ans) is smaller than zero 69 for(int i=1;i<=b.len;i++){ 70 if(b.num[i]<0){ 71 b.num[i]+=10; b.num[i+1]--; 72 } 73 ans.num[i]=b.num[i]-a.num[i]; 74 if(ans.num[i]<0){ 75 ans.num[i]+=10; b.num[i+1]--; 76 } 77 } 78 } 79 int len=max(a.len,b.len); 80 while(ans.num[len]<=0 && len>1)len--; 81 ans.len=len; 82 return ans; 83 }