时间复杂度:
- 加法和减法:O(m), m为最长字符串长度
- 乘法和除法:O(m2), m为最长字符串长度
头文件:algorithm, cstring, vector
//比较字符串
bool check(string a,string b){
if(a.size()>b.size()) return true;
if(a.size()==b.size()&&a>=b) return true;
return false;
}
//高精度加法
string add(string x,string y){
string ret;
int la,lb;
vector<int> a,b,ans;
if(!check(x,y)) swap(x,y);
la=x.size();
lb=y.size();
bool flag=false;
reverse(x.begin(),x.end());
reverse(y.begin(),y.end());
for(int i=0;i<la;i++){
a.push_back(x[i]-'0');
if(i<lb) b.push_back(y[i]-'0');
else b.push_back(0);
}
for(int i=0;i<la;i++){
ans.push_back(a[i]+b[i]);
if(flag){
ans[i]++;
flag=false;
}
if(ans[i]>=10){
ans[i]-=10;
flag=true;
}
}
if(flag) ans.push_back(1);
reverse(ans.begin(),ans.end());
for(auto i:ans) ret.push_back('0'+i);
return ret;
}
//高精度减法
string sub(string x,string y){
int n;
vector<int> a,b,ans;
string ret;
if(x==y) return "0";
if(!check(x,y)) swap(x,y);
n=x.size();
reverse(x.begin(),x.end());
reverse(y.begin(),y.end());
for(int i=0;i<n;i++){
a.push_back(x[i]-'0');
if(i<y.size()) b.push_back(y[i]-'0');
else b.push_back(0);
}
bool flag=false;
for(int i=0;i<n;i++){
ans.push_back(a[i]-b[i]);
if(flag){
ans[i]--;
flag=false;
}
if(ans[i]<0){
ans[i]+=10;
flag=true;
}
}
for(int i=ans.size()-1;i>0;i--){
if(ans[i]!=0) break;
ans.pop_back();
}
reverse(ans.begin(),ans.end());
for(auto i:ans) ret.push_back('0'+i);
return ret;
}
//高精度乘法
string multi(string x,string y){
string ret;
int la,lb;
if(!check(x,y)) swap(x,y);
la=x.size();
lb=y.size();
vector<int> a,b,ans(la*2);
reverse(x.begin(),x.end());
reverse(y.begin(),y.end());
for(int i=0;i<la;i++){
a.push_back(x[i]-'0');
if(i<lb) b.push_back(y[i]-'0');
else b.push_back(0);
}
for(int i=0;i<la;i++){
for(int j=0;j<la;j++){
ans[i+j]+=a[i]*b[j];
if(ans[i+j]>=10){
ans[i+j+1]+=ans[i+j]/10;
ans[i+j]%=10;
}
}
}
for(int i=ans.size()-1;i>0;i--){
if(ans[i]!=0) break;
ans.pop_back();
}
reverse(ans.begin(),ans.end());
for(auto i:ans) ret.push_back('0'+i);
return ret;
}
//高精度除法
string div(string x,string y){
string ret;
if(!check(x,y)) return "0";
int n=x.size();
int m=y.size();
string t=x.substr(0,m);
for(int i=m-1;i<n;i++){
int ans=0;
while(check(t,y)){
t=sub(t,y);
ans++;
}
ret.push_back(ans+'0');
reverse(t.begin(),t.end());
for(int j=t.size()-1;j>=0;j--){
if(t[j]!='0') break;
t.pop_back();
}
reverse(t.begin(),t.end());
if(i!=n-1) t.push_back(x[i+1]);
}
reverse(ret.begin(),ret.end());
for(int j=ret.size()-1;j>0;j--){
if(ret[j]!='0') break;
ret.pop_back();
}
reverse(ret.begin(),ret.end());
return ret;
}