目录
大数相加
string add(string a,string b){
int temp=0;char c;string ans="";
while(a.size()>b.size())b='0'+b; // 补零
while(a.size()<b.size())a='0'+a;
for(int i=0,j=a.size()-1;i<j;i++,j--){ // 转置
c=a[i];a[i]=a[j];a[j]=c;
}
for(int i=0,j=b.size()-1;i<j;i++,j--){
c=b[i];b[i]=b[j];b[j]=c;
}
for(int i=0;i<a.size();i++){ // 相加
c=(a[i]-'0'+b[i]-'0'+temp)%10+'0';
ans=c+ans;
temp=(a[i]-'0'+b[i]-'0'+temp)/10;
}
if(temp!=0){ // 进位
c=temp+'0';
ans=c+ans;
}
for(int i=0;i<ans.size();i++){ // 去掉前面的零
if(ans[i]!='0')return ans.substr(i,ans.size()-i);
}
return "0";
}
大数相减
string sub(string a,string b){
int temp;char c;string ans="";
if(a==b)return "0";
if(a.size()<b.size() || (a.size()==b.size()&&b>a)){ans=a;a=b;b=ans;ans="";} // 使得a>b
while(b.size()!=a.size())b='0'+b; // 补零
for(int i=0,j=a.size()-1;i<j;i++,j--){ // 转置
c=a[i];a[i]=a[j];a[j]=c;
}
for(int i=0,j=b.size()-1;i<j;i++,j--){
c=b[i];b[i]=b[j];b[j]=c;
}
for(int i=0;i<a.size();i++){ // 相减
if(a[i]<b[i]){a[i]+=10;a[i+1]--;}
c=(a[i]-b[i])+'0';
ans=c+ans;
}
for(int i=0;i<ans.size();i++){ // 去掉前面的零
if(ans[i]!='0')return ans.substr(i,ans.size()-i);
}
return "0";
}
大数相乘
string mul(string a,string b){
int temp;char c;string ans="";vector<int> v(a.size()+b.size(),0);
for(int i=0,j=a.size()-1;i<j;i++,j--){ // 转置
c=a[i];a[i]=a[j];a[j]=c;
}
for(int i=0,j=b.size()-1;i<j;i++,j--){
c=b[i];b[i]=b[j];b[j]=c;
}
for(int i=0;i<a.size();i++){ // 相乘
for(int j=0;j<b.size();j++){
v[i+j]+=(a[i]-'0')*(b[j]-'0');
}
}
for(int i=0;i<v.size();i++){ // 处理进位
v[i+1]+=v[i]/10;
v[i]%=10;
c=v[i]+'0';
ans=c+ans;
}
for(int i=0;i<ans.size();i++){ // 去掉前面的零
if(ans[i]!='0')return ans.substr(i,ans.size()-i);
}
return "0";
}
大数相除
string div(string a,string b){
int num;char c;string temp,temp2,ans="0",ans2="";
if(a==b)return "1";
if(a.size()<b.size() || (a.size()==b.size()&&a<b))return "0";
num=a.size()-b.size(); // 获取位数的差值
for(int i=num;i>=0;i--){ // 根据每次相减,获得商
temp=b;temp2="1";
for(int j=0;j<i;j++){temp+='0';temp2+='0';} // 被减数、应增加的商
while(a.size()>temp.size() || (a.size()==temp.size()&&a>=temp)){ // 相减
a=sub(a,temp);
ans=add(ans,temp2);
}
}
ans2=a; // 余数
for(int i=0;i<ans.size();i++){ // 去掉前面的零
if(ans[i]!='0')return ans.substr(i,ans.size()-i);
}
return "0";
}