高精度整数四则运算
一般情况下,如果要用到高精度运算,最好使用 python 语言编写程序,因为 python 语言本身的整数类型就自带高精度运算。
高精度与高精度的加法
//默认输入的a和b均为非负整数
string Plus(const string& a, const string& b) {
string ans;
gg carry = 0; //进位
for (gg i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0 || carry != 0; --i, --j) {
gg p1 = i >= 0 ? a[i] - '0' : 0, p2 = j >= 0 ? b[j] - '0' : 0;
gg k = p1 + p2 + carry;
ans.push_back(k % 10 + '0');
carry = k / 10;
}
reverse(begin(ans), end(ans)); //要进行翻转
return ans;
}
高精度与高精度的减法
//默认输入的a和b均为非负整数,且a>=b
string Sub(string a, const string& b) {
string ans;
for (gg i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; --i, --j) {
gg p1 = i >= 0 ? a[i] - '0' : 0, p2 = j >= 0 ? b[j] - '0' : 0;
if (p1 < p2) { //不够减,要借位
a[i - 1]--;
p1 += 10;
}
gg k = p1 - p2;
ans.push_back(k % 10 + '0');
}
ans.erase(ans.find_last_not_of('0') + 1, ans.size());
reverse(begin(ans), end(ans)); //要进行翻转
return ans.empty() ? "0" : ans;
}
高精度与高精度的乘法
//默认a和b均为非负整数
string Multiply(const string& a, const string& b) {
gg m = a.size(), n = b.size();
string ans(n + m, '0'); //最终乘积最多有n+m位
for (gg i = m - 1; i >= 0; --i) {
for (gg j = n - 1; j >= 0; --j) {
gg k = (a[i] - '0') * (b[j] - '0');
gg t = k + (ans[i + j + 1] - '0');
ans[i + j] += t / 10; //向乘积的i+j位进位
ans[i + j + 1] = t % 10 + '0'; //填充乘积的i+j+1位
}
}
ans.erase(0, ans.find_first_not_of("0")); //删除前导0
return ans.empty() ? "0" : ans;
}
高精度与低精度的除法
//默认a为非负整数,b为正整数
pair<string, gg> DivMod(const string& a, gg b) {
string ans; //商
gg mod = 0; //余数
for (char c : a) {
mod = c - '0' + mod * 10;
ans.push_back(mod / b + '0');
mod %= b;
}
ans.erase(0, ans.find_first_not_of('0')); //删除多余的前导0
return {ans.empty() ? "0" : ans, mod};
}
高精度与低精度的取模运算
//默认a为非负整数,b为正整数,返回a%b
gg Mod(const string& a, gg b) {
gg ans = 0;
for (char c: a){
ans = ((ans * 10 + c - '0') % m);
}
return ans;
}