高精加
string add(string a,string b){
int na[N] = {0},nb[N] = {0};
string res;
if(a.size() < b.size()) return add(b,a);
int len = max(a.size(), b.size());
for(int i = a.size();i > 0;i --) na[i] = a[a.size() - i] - '0';
for(int i = b.size();i > 0;i --) nb[i] = b[b.size() - i] - '0';
int t = 0;
for(int i = 1;i <= len;i ++){
na[i] += nb[i] + t;
t = na[i] / 10;
na[i] %= 10;
}
if(t) na[++len] = t;
while(na[len] == 0)len --;
for(int i = len;i > 0;i --) res += na[i] + '0';
return res;
}
高精减
只需要把大的放在前面就可以了
注意特判两数相等的情况(返回"0")
string sub(string a,string b){
int na[N] = {0},nb[N] = {0},ans[N] = {0};
string res;
if((a < b && a.size() <= b.size()) || b.size() > a.size())
return "-" + sub(b,a);
for(int i = a.size();i > 0;i --) na[i] = a[a.size() - i] - '0';
for(int i = b.size();i > 0;i --) nb[i] = b[b.size() - i] - '0';
int maxl = max(a.size(),b.size());
for(int i = 1;i <= maxl;i ++){
if(na[i] < nb[i]){
na[i + 1] --;
na[i] += 10;
}
ans[i] = na[i] - nb[i];
}
while(ans[maxl] == 0) maxl --;
if(maxl < 1) return "0";
for(int i = maxl;i > 0;i --) res += ans[i] + '0';
return res;
}
高精乘
大数乘小数
string mul(string a,int k){
int na[N] = {0};
string res;
for(int i = a.size();i > 0;i --) na[i] = a[a.size() - i] - '0';
int t = 0;
for(int i = 1;i <= a.size();i ++){
na[i] = na[i] * k + t;
t = na[i] / 10;
na[i] %= 10;
}
int len = a.size();
if(t) na[++len] = t;
for(int i = len;i > 0;i --) res += na[i] + '0';
return res;
}
高精除
大数除小数
string div(string a,int k){
string res;
int na[N] = {0};
for(int i = a.size();i > 0;i --) na[i] = a[i - 1] - '0';
int t = 0;
for(int i = 1;i <= a.size();i ++){
t = t * 10 + na[i];
na[i] = t / k;
t %= k;
}
int len = a.size();
while(na[len] == 0 && len > 1) len --;
for(int i = len;i > 0;i --) res += na[i] + '0';
return res;
}