1.加法模板
string add(string s1,string s2) { int i,j,k,t; string sum; t=0; k=0; if(s2.size()>s1.size()) { s1.swap(s2); k=1; } for(i=0;i<s2.size();i++) { sum+=(s1[s1.size()-1-i]-'0'+s2[s2.size()-1-i]-'0'+t)+'0'; if((s1[s1.size()-1-i]-'0'+s2[s2.size()-1-i]-'0'+t)>=10)t=1; else t=0; } if(s1.size()==s2.size()&&t==1)sum+='1'; else { for(j=s1.size()-1-i;j>=0;j--) { sum+=(s1[j]-'0'+t)+'0'; if(s1[j]-'0'+t>=10)t=1; else t=0; } if(t==1)sum+='1'; } reverse(sum.begin(),sum.end()); return sum; } 2.减法模板 string sub(string s1,string s2) { int flag=0,i; if(s1.size()<=s2.size()) { if(s2.size()>s1.size())flag=1; else { for(i=0;i<s1.size();i++) { if(s1[i]>s2[i])break; else if(s1[i]<s2[i]) { flag=1; break; } } } } if(flag==1)s1.swap(s2); string ans; reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); for(i=0;i<s1.size();i++) { if(i>=s2.size())s2+='0'; ans+=s1[i]-s2[i]+'0'; if(s1[i]<s2[i]) { ans[i]+=10; s1[i+1]-=1; } } reverse(ans.begin(),ans.end()); for(i=0;i<ans.size();i++) { if(*ans.begin()=='0')ans.erase(ans.begin()); else break; } if(flag==1)ans.insert(0,"-"); return ans.size()==0?"0":ans; } 3.乘法模板 string mul(string s1,string s2) { int i,j,t; vector<int> num1,num2,ans; string s; for(i=s1.size()-1,j=0;i>=0;i--) { num1.push_back(s1[i]-'0'); } for(i=s2.size()-1,j=0;i>=0;i--) { num2.push_back(s2[i]-'0'); } for(i=0;i<num2.size();i++) for(j=0;j<num1.size();j++) { if(i+j>=ans.size())ans.push_back(num1[j]*num2[i]); else ans[i+j]+=num1[j]*num2[i]; } t=0; for(i=0;i<ans.size();i++) { ans[i]+=t; t=ans[i]/10; ans[i]%=10; } if(t!=0)ans.push_back(t); reverse(ans.begin(),ans.end()); for(i=0;i<ans.size();i++) s+=ans[i]+'0'; return s; } 4.高精度除法 const int L=110; int sub(int *a,int *b,int La,int Lb) { if(La<Lb) return -1; if(La==Lb) { for(int i=La-1;i>=0;i--) if(a[i]>b[i]) break; else if(a[i]<b[i]) return -1; } for(int i=0;i<La;i++) { a[i]-=b[i]; if(a[i]<0) a[i]+=10,a[i+1]--; } for(int i=La-1;i>=0;i--) if(a[i]) return i+1; return 0; } string div(string n1,string n2,int nn) { string s,v; int a[L],b[L],r[L],La=n1.size(),Lb=n2.size(),i,tp=La; fill(a,a+L,0);fill(b,b+L,0);fill(r,r+L,0); for(i=La-1;i>=0;i--) a[La-1-i]=n1[i]-'0'; for(i=Lb-1;i>=0;i--) b[Lb-1-i]=n2[i]-'0'; if(La<Lb || (La==Lb && n1<n2)) { return n1;} int t=La-Lb; for(int i=La-1;i>=0;i--) if(i>=t) b[i]=b[i-t]; else b[i]=0; Lb=La; for(int j=0;j<=t;j++) { int temp; while((temp=sub(a,b+j,La,Lb-j))>=0) { La=temp; r[t-j]++; } } for(i=0;i<L-10;i++) r[i+1]+=r[i]/10,r[i]%=10; while(!r[i]) i--; while(i>=0) s+=r[i--]+'0'; i=tp; while(!a[i]) i--; while(i>=0) v+=a[i--]+'0'; if(v.empty()) v="0"; if(nn==1) return s; if(nn==2) return v; }