C++大数模板(加,减,乘,除等)
大数加大数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string add(string a,string b) { string c; int len1=a.length(),len2=b.length(),len=max(len1,len2),ok=0; for(int i=len1; i<len; i++) a="0"+a; for(int i=len2; i<len; i++) b="0"+b; for(int i=len-1; i>=0; i--){ char temp=a[i]+b[i]-'0'+ok; if(temp>'9') ok=1,temp-=10; else ok=0; c=temp+c; } if(ok) c="1"+c; return c; }
大数减大数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string sub(string a,string b) { string c; int len1=a.length(),len2=b.length(),len=max(len1,len2),ok=0; for(int i=len1; i<len; i++) a="0"+a; for(int i=len2; i<len; i++) b="0"+b; if(a<b){ string temp=a; a=b; b=temp; ok=1; } for(int i=len-1; i>=0; i--){ if(a[i]<b[i]){ a[i-1]-=1; a[i]+=10; } char temp=a[i]-b[i]+'0'; c=temp+c; } int pos=0; while(c[pos]=='0' && pos<len) pos++;//剔除前导 0 if(pos==len) return "0"; if(ok) return "-"+c.substr(pos);//负数特判即可(保证结果符号) return c.substr(pos); }
大数乘整数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string mul(string a,int b) { string c; char s; int len=a.length(),ok=0; for(int i=len-1; i>=0; i--){ int temp=(a[i]-'0')*b+ok; ok=temp/10; s=temp%10+'0'; c=s+c; } while(ok){ s=ok%10+'0'; c=s+c; ok/=10; } return c; }
大数乘大数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string multiply(string a,string b){ string sum; int flag=0; vector <int> result(a.size()+b.size(),0); //判断0 if(a[0]=='0' || b[0]=='0'){ sum.push_back('0'); return sum; } //判断符号 if(a[0]=='-'||b[0]=='-'){ flag=1; if(a[0]=='-'&&b[0]=='-') flag=0; if(a[0]=='-') a=a.substr(1,a.size()-1); if(b[0]=='-') b=b.substr(1,b.size()-1); } reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); int num1,num2; for(int i=0;i<a.size();i++){ for(int j=0;j<b.size();j++){ num1=a[i]-'0'; num2=b[j]-'0'; result[i+j]+=num1*num2; } } for(int i=0;i<result.size();i++){ if(result[i]>=10){ result[i+1]+=result[i]/10; result[i]%=10; } sum.push_back(result[i]+'0'); } reverse(sum.begin(),sum.end()); int ind=-1; while(sum[++ind]=='0'); if(ind!=-1) sum=sum.substr(ind); if(flag){ cout<<'-'; } return sum; }
大数整除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string div(string a,int b) { string c; int len=a.length(),ans=0; char s; for(int i=0; i<len; i++){ ans=ans*10+a[i]-'0'; s=ans/b+'0'; ans%=b; c+=s; } int pos=0; while(pos<len && c[pos]=='0') pos++; if(pos==len) return "0"; return c.substr(pos); }
大数除大数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
bool big(string a,string b,int i) { for(int j=i; j<i+b.length(); j++){ if(a[j]>b[j-i])return true; if(a[j]<b[j-i]) return false; } return true; } string Div(string a,string b) { int i,p=0,lena=a.length(),ok=0,lenb=b.length(); string c; for(i=0; i<lena; i++) c+='0'; i=0; while(i<=lena-lenb){ if(i>lena-lenb) break; while(big(a,b,i)||(i>0 && a[i-1]>'0')){ for(int j=lenb-1; j>=0; j--) if(a[i+j]>=b[j]) a[i+j]-=b[j]-'0'; else a[i+j-1]--,a[i+j]+=10+'0'-b[j]; c[i+lenb-1]++; } i++; } string ans; int lenc=c.length(); for(int i=0; i<lenc; i++){ if(c[i]=='0'&&!ok) continue; ok=1; ans+=c[i]; } return ans; }
大数判相等
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string solve(string s) { int len=s.length(),x=0,y=len-1;; bool ok=false; for(int i=0; i<len; i++){ if(s[i]=='.'){ ok=true; break;//o(n)查找小数点 } } if(ok){ for(; y>=x; y--) if(s[y]!='0') break; if(s[y]=='.') y--; } for(; x<len-1; x++) if(s[x]!='0') break; if(s[x]=='.') x--; return s.substr(x,y-x+1); } bool Equal(string s1,string s2) { if(s1[0]=='-' && s2[0]=='-'){ s1=s1.substr(1); s2=s2.substr(1); } else if(s1[0]=='-' || s2[0]=='-'){ if(s1[0]=='-') s1=s1.substr(1); if(s2[0]=='-') s2=s2.substr(1); s1=solve(s1); s2=solve(s2); if(s1=="0"&&s2=="0") return true; return false; } if(s1[0]=='+') s1=s1.substr(1); if(s2[0]=='+') s2=s2.substr(1); s1=solve(s1); s2=solve(s2); if(s1==s2) return true; return false; }
浮点数的n次方
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string Mul(string s,long long x) { reverse(s.begin(),s.end()); long cmp=0; for(int i=0; i<s.size(); i++){ cmp=(s[i]-'0')*x+cmp; s[i]=(cmp%10+'0'); cmp/=10; } while(cmp){ s+=(cmp%10+'0'); cmp/=10; } reverse(s.begin(),s.end()); return s; } string delete_later_zero(string s) { int ok=1; for(int i=s.size()-1; i>=0; i--){ if(s[i]=='0')s.erase(i); else if(s[i]=='.'){ s.erase(i); ok=0; } else ok=0; if(ok==0) break; } return s; } string fac(string s,int n) { if(n==0) return "1"; string cmp="",count=""; long long x=0,point=0; for(int i=0; i<s.size(); i++) if(s[i]!='.'){ cmp+=s[i]; x=x*10+(s[i]-'0'); } else point=s.size()-1-i; for(int i=1; i<n; i++) cmp=Mul(cmp,x); int ans_point=cmp.size()-n*point; if(ans_point<0){ count+='.'; for(int i=ans_point; i!=0; i++) count+='0'; } string::iterator it=cmp.begin(); if(ans_point>=0&&ans_point<cmp.size()) cmp.insert(it+ans_point,'.'); count+=(delete_later_zero(cmp)); return count;//注意一下小于 1 的数的输出 }
大数取余
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int MOD(string str,int mod) { int rem=0; for(int i=0; i<str.length(); i++){ rem=rem*10+str[i]-'0'; rem=rem%mod; } return rem; }