高精度加法、減法、乘法
阿新 • • 發佈:2020-06-27
#include<bits/stdc++.h> using namespace std; const int maxn=100005; struct asd{ int ans[maxn],len; bool jud; asd(){ memset(ans,0,sizeof(ans)); len=1; jud=0; } asd operator +(asd &A){ asd B; B.len=max(len,A.len); for(int i=0;i<B.len;i++){ B.ans[i]+=A.ans[i]+ans[i]; if(B.ans[i]>=10){ B.ans[i]-=10; B.ans[i+1]+=1; } } if(B.ans[B.len]) B.len++; return B; } asd operator -(asd &A) { asd B; bool jud=0; if(A.len>len) jud=1; else if(A.len==len){ for(int i=len-1;i>=0;i--){ if(A.ans[i]>ans[i]){ jud=1; break; } if(A.ans[i]<ans[i]) break; } } if(jud){ B.len=A.len; for(int i=0;i<B.len;i++){ if(A.ans[i]>=ans[i]){ B.ans[i]=A.ans[i]-ans[i]; } else { B.ans[i]=A.ans[i]-ans[i]+10; A.ans[i+1]--; } } } else { B.len=len; for(int i=0;i<B.len;i++){ if(ans[i]>=A.ans[i]){ B.ans[i]=ans[i]-A.ans[i]; } else { B.ans[i]=ans[i]-A.ans[i]+10; ans[i+1]--; } } } B.jud=jud; return B; } asd operator *(asd &A){ asd B; for(int i=0;i<A.len;i++){ for(int j=0;j<len;j++){ B.ans[i+j]+=A.ans[i]*ans[j]; } } for(int i=0;i<A.len;i++){ for(int j=0;j<len;j++){ if(B.ans[i+j]>=10){ B.ans[i+j+1]+=B.ans[i+j]/10; B.ans[i+j]%=10; } } } B.len=A.len+len; return B; } void read(){ char s[maxn]; scanf("%s",s); int ll=strlen(s); for(int i=0;i<ll;i++) ans[i]=s[ll-i-1]-'0'; len=ll; while(ans[len-1]==0 && len-1!=0) len--; } void write(){ while(ans[len-1]==0 && len-1!=0) len--; if(jud==1) printf("-"); for(int i=len-1;i>=0;i--){ printf("%d",ans[i]); } printf("\n"); } }; asd a,b,c; int main(){ a.read(); b.read(); c=a*b;//乘法 c=a+b;//加法 c=a-b;//減法 c.write(); return 0; }