高精度乘法
inline string mult(string a, string b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int len1 = a.size(), len2 = b.size();
int len = len1 + len2;
int c[len + 10] = {};
for(int i = 0; i < len1; i++) {
for(int j = 0; j < len2; j++) {
c[i + j] += (a[i] - '0') * (b[j] - '0');
}
}for(int i = 0; i < len - 1; i++) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}while (c[len] == 0) len --;
string ans = "";
for(int i = len; i >= 0; i--) ans += c[i] + '0';
return ans;
}
高精度阶乘
inline string fact(int n) {
string ans = "1";
for(int i = 1; i <= n; i++) ans = mult(ans, to_string(i));
return ans;
}
高精度次幂(普通版)
string slowPow(string a, int b) {
if (b == 0) return "1";
string res = "1";
while (b --) {
res = mult(res, a);
}return res;
}
高精度快速幂
快速幂(迭代版)
string fastPow(string a, int b) {
string res = "1";
while (b > 0) {
if (b & 1) {
res = mult(res, a);
}a = mult(a, a);
b >>= 1;
}return res;
}
快速幂(递归版)
string fastPow(string a, int b) {
if (b == 0) return "1";
if (b == 1) return a;
if (!(b & 1)) {
string t = fastPow(a, b >> 1);
return mult(t, t);
}else {
return mult(a, fastPow(a, b - 1));
}
}
对比
指标 |
普通幂 |
快速幂-迭代版 |
快速幂-递归版 |
时间复杂度 |
O(bn2) |
O(log2bn2) |
空间复杂度 |
O(1) |
O(log2b)(递归栈) |
乘法次数 |
b次 |
log2b次 |
最大支持指数 |
b<104 |
b≤1018 |
b≤106(防栈溢出) |
代码简洁性 |
⭐⭐⭐⭐ |
⭐⭐⭐ |
⭐⭐⭐⭐⭐ |
运行效率 |
极慢(线性增长) |
极快(对数增长) |
较快(递归调用有开销) |
负数处理 |
需额外处理 |
自动兼容 |
适用场景 |
教学演示 |
竞赛/工程优化 |
算法学习/小规模数据 |