【模板】【高精度】
阿新 • • 發佈:2021-10-07
據hws和dwt大佬說不會考,先扔在這吧。
#include<bits/stdc++.h> using namespace std; #define rg register const int maxn=2005,bas=10000; struct big{ int num[maxn],len; bool f; big(){ memset(num,0,sizeof(num)); len=f=0; } friend bool operator <(const big& A,const big& B){ if(A.len<B.len) return 1; else if(A.len>B.len) return 0; for(rg int i=A.len;i>=1;i--){ if(A.num[i]<B.num[i]) return 1; else if(A.num[i]>B.num[i]) return 0; } return 0; } friend big operator + (const big& A,const big& B){ rg big C; C.len=std::max(A.len,B.len); for(rg int i=1;i<=C.len;i++){ C.num[i]+=A.num[i]+B.num[i]; if(C.num[i]>=bas){ C.num[i]-=bas; C.num[i+1]++; } } if(C.num[C.len+1]) C.len++; return C; } friend big operator -(const big& A,const big& B) { rg big C; int js[maxn]; if(A<B){ C.len=B.len; for(rg int i=1;i<=C.len;i++){ if(B.num[i]+js[i]>=A.num[i]){ C.num[i]=B.num[i]+js[i]-A.num[i]; } else { C.num[i]=B.num[i]+js[i]-A.num[i]+bas; js[i+1]-=1; } } C.f=1; } else { C.len=A.len; for(rg int i=1;i<=C.len;i++){ if(A.num[i]+js[i]>=B.num[i]){ C.num[i]=A.num[i]+js[i]-B.num[i]; } else { C.num[i]=A.num[i]+js[i]-B.num[i]+bas; js[i+1]-=1; } } C.f=0; } while(!C.num[C.len]) C.len--; return C; } friend big operator * (const big& A,const big& B){ rg big C; C.len=A.len+B.len; for(rg int i=1;i<=A.len;i++){ for(rg int j=1;j<=B.len;j++){ C.num[i+j-1]+=A.num[i]*B.num[j]; if(C.num[i+j-1]>=bas){ C.num[i+j]+=C.num[i+j-1]/bas; C.num[i+j-1]%=bas; } } } if(!C.num[C.len]) C.len--; return C; } friend big operator /(const big &A,const int &B){ rg big C; C.len=A.len; rg long long nans=0; for(rg int i=A.len;i>=1;i--){ nans=nans*bas+A.num[i]; if(nans>=B){ C.num[i]=nans/B; nans%=B; } } while(!C.num[C.len]) C.len--; return C; } friend int operator %(const big &A,const int &B){ rg long long nans=0; for(rg int i=A.len;i>=1;i--){ nans=nans*bas+A.num[i]; if(nans>=B) nans%=B; } return nans; } void read(rg int val){//讀入單精 len=0,f=0,memset(num,0,sizeof(num)); while(val){ num[++len]=val%bas; val/=bas; } } void autoread(){ char s[maxn]; scanf("%s",s+4); rg int len2=strlen(s+4); s[0]=s[1]=s[2]=s[3]='0'; len=0; for(rg int i=len2+3;i>=4;i-=4){ num[++len]=(s[i-3]-'0')*1000+(s[i-2]-'0')*100+(s[i-1]-'0')*10+s[i]-'0'; } while(num[len] && !len) len--; } void write(){//輸出 if(len && f) printf("-"); if(!len) printf("0\n"); if(len) printf("%d",num[len]); for(rg int i=len-1;i>=1;i--){ printf("%04d",num[i]); } printf("\n"); } }; signed main() { big a,b; a.read(100000);b.read(9999); big ans=a+b; ans.write(); big x,y; x.autoread();y.autoread(); big ans1=x+y; ans1.write(); return 0; }