高精度专题
高精度加减乘
- 需要注意区分len和c.len
- temp要注意及时恢复成零,尤其是外圈循环
- 内层temp修改的时候避免影响到本轮
- 注意出现多余的0的判断是c.d[c.len-1]balabala,使用c.d[c.len]不可哦,范围是0-c.len01
- 并且删除掉多余的0的时候要至少保留一位,所以c.len>=2是边界条件
- 减法修改顺序,cmp自己写,遇到了添加减号。
- 高精度加法暂时只适用于非负数
高精度减法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; struct bign { int d[11000]; int len;//len是长度,存0~len-1 bign() { memset(d,0,sizeof(d)); len=0; } }; bool cmp(bign a,bign b) { if(a.len!=b.len) { return a.len>b.len; } int len=a.len; for(int i=len-1;i>=0;i--) { if(a.d[i]!=b.d[i]) return a.d[i]>b.d[i]; } return true; } bign add(bign a,bign b) { bign c; int temp=0; int len=max(a.len,b.len); for(int i=0;i<=len-1;i++) { c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10; temp=(a.d[i]+b.d[i]+temp)/10; } if(temp) { c.d[c.len++]=1; } return c; } bign sub(bign a,bign b)//规定a-b大于等于0了 { if(cmp(a,b)==false) { bign temp=a; a=b; b=temp; }//强制大减小 int temp=0; bign c; int len=max(a.len,b.len); for(int i=0;i<=len-1;i++) { c.d[i]=a.d[i]-b.d[i]+temp; temp=0; if(c.d[i]<0) { c.d[i]=c.d[i]+10; temp=-1; } } c.len=len; while(c.d[c.len-1]==0 && c.len>=2) c.len--; return c; } bign multi(bign a,bign b) { int temp=0; bign c; for(int i=0;i<=a.len-1;i++) { for(int j=0;j<=b.len-1;j++) { c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp; temp=c.d[i+j]/10; c.d[i+j]=c.d[i+j]%10; } c.d[i+b.len]=c.d[i+b.len]+temp; temp=0;//一定要写 } c.len=a.len+b.len; while(c.d[c.len-1]==0 && c.len>=2) c.len--; return c; } bign change(char str[]) { bign c; int len=strlen(str); for(int i=len-1;i>=0;i--) c.d[len-1-i]=str[i]-'0'; c.len=len; return c; } void print(bign a) { for(int i=a.len-1;i>=0;i--) printf("%d",a.d[i]); printf("\n"); return ; } int main() { bign a; bign b; char str1[11000]; char str2[11000]; scanf("%s",str1); scanf("%s",str2); a=change(str1); b=change(str2); // bign ans=add(a,b); bign ans1=sub(a,b); //bign ans2=multi(a,b); //print(a); //print(b); // print(ans); if(!cmp(a,b)) printf("-"); print(ans1); //print(ans2); return 0; }
高精度加法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; struct bign { int d[1000]; int len;//len是长度,存0~len-1 bign() { memset(d,0,sizeof(d)); len=0; } }; bool cmp(bign a,bign b) { if(a.len!=b.len) { return a.len>b.len; } int len=a.len; for(int i=len-1;i>=0;i--) { if(a.d[i]!=b.d[i]) return a.d[i]>b.d[i]; } return true; } bign add(bign a,bign b) { bign c; int temp=0; int len=max(a.len,b.len); for(int i=0;i<=len-1;i++) { c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10; temp=(a.d[i]+b.d[i]+temp)/10; } if(temp) { c.d[c.len++]=1; } return c; } bign sub(bign a,bign b)//规定a-b大于等于0了 { if(cmp(a,b)==false) { bign temp=a; a=b; b=temp; }//强制大减小 int temp=0; bign c; int len=max(a.len,b.len); for(int i=0;i<=len-1;i++) { c.d[i]=a.d[i]-b.d[i]+temp; temp=0; if(c.d[i]<0) { c.d[i]=c.d[i]+10; temp=-1; } } c.len=len; while(c.d[c.len-1]==0 && c.len>=2) c.len--; return c; } bign multi(bign a,bign b) { int temp=0; bign c; for(int i=0;i<=a.len-1;i++) { for(int j=0;j<=b.len-1;j++) { c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp; temp=c.d[i+j]/10; c.d[i+j]=c.d[i+j]%10; } c.d[i+b.len]=c.d[i+b.len]+temp; temp=0;//一定要写 } c.len=a.len+b.len; while(c.d[c.len-1]==0 && c.len>=2) c.len--; return c; } bign change(char str[]) { bign c; int len=strlen(str); for(int i=len-1;i>=0;i--) c.d[len-1-i]=str[i]-'0'; c.len=len; return c; } void print(bign a) { for(int i=a.len-1;i>=0;i--) printf("%d",a.d[i]); printf("\n"); return ; } int main() { bign a; bign b; char str1[1000]; char str2[1000]; scanf("%s",str1); scanf("%s",str2); a=change(str1); b=change(str2); bign ans=add(a,b); //bign ans1=sub(a,b); //bign ans2=multi(a,b); //print(a); //print(b); print(ans); //print(ans1); //print(ans2); return 0; }
写了高精度加减乘,暂时不会高精度除高精度,回头补。加减已验证,乘暂时没验证
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; struct bign { int d[1000]; int len;//len是长度,存0~len-1 bign() { memset(d,0,sizeof(d)); len=0; } }; bool cmp(bign a,bign b) { if(a.len!=b.len) { return a.len>b.len; } int len=a.len; for(int i=len-1;i>=0;i--) { if(a.d[i]!=b.d[i]) return a.d[i]>b.d[i]; } return true; } bign add(bign a,bign b) { bign c; int temp=0; int len=max(a.len,b.len); for(int i=0;i<=len-1;i++) { c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10; temp=(a.d[i]+b.d[i]+temp)/10; } if(temp) { c.d[c.len++]=1; } return c; } bign sub(bign a,bign b)//规定a-b大于等于0了 { if(cmp(a,b)==false) { bign temp=a; a=b; b=temp; }//强制大减小 int temp=0; bign c; int len=max(a.len,b.len); for(int i=0;i<=len-1;i++) { c.d[i]=a.d[i]-b.d[i]+temp; temp=0; if(c.d[i]<0) { c.d[i]=c.d[i]+10; temp=-1; } } c.len=len; while(c.d[c.len-1]==0 && c.len>=2) c.len--; return c; } bign multi(bign a,bign b) { int temp=0; bign c; for(int i=0;i<=a.len-1;i++) { for(int j=0;j<=b.len-1;j++) { c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp; temp=c.d[i+j]/10; c.d[i+j]=c.d[i+j]%10; } c.d[i+b.len]=c.d[i+b.len]+temp; temp=0;//一定要写 } c.len=a.len+b.len; while(c.d[c.len-1]==0 && c.len>=2) c.len--; return c; } bign change(char str[]) { bign c; int len=strlen(str); for(int i=len-1;i>=0;i--) c.d[len-1-i]=str[i]-'0'; c.len=len; return c; } void print(bign a) { for(int i=a.len-1;i>=0;i--) printf("%d",a.d[i]); printf("\n"); return ; } int main() { bign a; bign b; char str1[1000]; char str2[1000]; scanf("%s",str1); scanf("%s",str2); a=change(str1); b=change(str2); bign ans=add(a,b); //bign ans1=sub(a,b); //bign ans2=multi(a,b); //print(a); //print(b); print(ans); //print(ans1); //print(ans2); return 0; }
时间才能证明一切,选好了就尽力去做吧!