首页 > 代码库 > 高精度 模板 压代码 精简版

高精度 模板 压代码 精简版

 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 ret;29     int i=1,x=0;30     while(i<=A.len || i<=B.len){31         ret.num[i]=A.num[i]+B.num[i]+x;32         x=ret.num[i]/10; ret.num[i]%=10; i++;33     }34     ret.num[i]=x;  ret.len=i;35     if(!ret.num[ret.len])ret.len--;36     return ret;37 }38 bign operator * (bign a,bign b){39     bign ans;40     int len=a.len+b.len;41     for(int i=1;i<=a.len;i++){42         int x=0;43         for(int j=1;j<=b.len;j++){44             ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);45             x=ans.num[i+j-1]/10;46             ans.num[i+j-1]%=10;47         }48         ans.num[i+b.len]+=x;49     }50     while(!ans.num[len] && len>1)len--;51     ans.len=len;52     return ans;53 }54 bign operator - (bign a,bign b){55     bign ans;56     if(a==b)return ans;57     if(b<a){58         for(int i=1;i<=a.len;i++){59             if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;60             ans.num[i]=a.num[i]-b.num[i];61             if(ans.num[i]<0){62                 ans.num[i]+=10; a.num[i+1]--;//向a的高位借位63             }64         }65     }66     else{67         ans.flag=1;// this number(I mean the ans) is smaller than zero68         for(int i=1;i<=b.len;i++){69             if(b.num[i]<0){70                 b.num[i]+=10; b.num[i+1]--;71             }72             ans.num[i]=b.num[i]-a.num[i];73             if(ans.num[i]<0){74                 ans.num[i]+=10; b.num[i+1]--;75             }76         }77     }78     int len=max(a.len,b.len);79     while(ans.num[len]<=0 && len>1)len--;80     ans.len=len;81     return ans;82 }

注:本代码已略去bign读入、输出函数(很简单,不必使用函数),主函数已省去~

高精度 模板 压代码 精简版