模板来自:【C++/string】 大数高精度运算模板
加法
string add(string a, string b)
{
string ans;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
a.push_back('0');
b.push_back('0');
if(a.size() < b.size()) swap(a, b);
while(b.size() < a.size()) b.push_back('0');
int c[1000]={0}, k = a.size();
for(int i = 0; i < a.size(); i++){
int sum = c[i] + a[i]-'0' + b[i] - '0';
c[i] = sum%10;
c[i+1] += sum/10;
}
while(c[k]==0 && k>=0) k--;
while(k >= 0)
ans.push_back(c[k--]+'0');
return ans;
}
减法
string sub(string a, string b)
{
string ans;
bool flag = false;
if(a.size() < b.size() || (a.size()==b.size() && a < b)){
swap(a, b);
flag = true;
}
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
a.push_back('0'); b.push_back('0');
if(a.size() < b.size()) swap(a, b);
while(b.size() < a.size()) b.push_back('0');
int c[1000]={0}, k = a.size();
for(int i = 0; i < a.size(); i++){
if(a[i] < b[i]) a[i]+=10, a[i+1]--;
c[i] = a[i] - b[i];
}
while(c[k]==0 && k>=0) k--;
if(flag) ans.push_back('-');
while(k >= 0)
ans.push_back(c[k--]+'0');
return ans;
}
乘法
string mcl(string a, string b)
{
string ans;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int c[1000]={0}, k = a.size()+b.size()+1;
for(int i = 0; i < a.size(); i++)
for(int j = 0; j < b.size(); j++){
c[i+j] += (a[i]-'0')*(b[j]-'0');
c[i+j+1] += c[i+j]/10;
c[i+j] %= 10;
}
while(c[k]==0 && k>=0) k--;
while(k >= 0)
ans.push_back(c[k--]+'0');
return ans;
}
除法
string div(string a, long long b)
{
string ans;
int c[256] = {0}, rest = 0;
for(int i = 0; i < a.size(); i++){
rest = 10*rest + a[i] - '0';
c[i] = rest / b;
rest %= b;
}
int k = 0;
while(c[k] == 0 && k < a.size()-1)
k++;
for(int i = k; i < a.size(); i++)
ans.push_back(c[i]+'0');
return ans;
}