首页 > 代码库 > 高精度 模板 压代码 精简版
高精度 模板 压代码 精简版
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读入、输出函数(很简单,不必使用函数),主函数已省去~
高精度 模板 压代码 精简版
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。