快速幂本身无需数组,仅用标量变量迭代更新;但高精度快速幂必须用数组存储大整数各位数字(逆序)、动态维护长度、实现高精度乘法与进位处理。
快速幂本身不依赖数组变量存储中间状态,它的核心是用几个标量变量(如 res、base、exp)在迭代中动态更新,靠位运算和平方递推完成指数拆分。但当问题升级——比如计算 2 的 n 次方的完整十进制表示(不取模),或实现 高精度快速幂 时,数组就成为必要载体。
高精度场景下必须用数组存状态
普通快速幂处理的是 long long 范围内的数,一旦结果超出 64 位(例如 N ≥ 60 时,2^N 就超过 1e18),就必须用数组模拟大整数。此时:
-
res不再是单个整数,而是一个BigInt结构,内部用int digits[MAX_DIGITS]存各位数字(通常逆序:digits[0]是个位); -
base同样需用数组表示(初始为[2]); - 每次
base = base × base和res = res × base都要调用高精度乘法函数,逐位计算并处理进位; - 数组长度
len必须实时维护,因为 2^N 的位数约为N × log₁₀2 ≈ N × 0.3010,N=10⁵ 时结果约有 3 万位。
数组设计关键细节
- 逆序存储:加法/乘法从低位开始,避免每次计算都倒着索引;
-
进位统一处理:乘法中每轮
carry = (a[i] * b + carry) / 10,余数存入当前位; -
长度动态增长:平方后位数最多翻倍,需预留足够空间(如
MAX_DIGITS = 100005); -
前导零清理:运算后检查
digits[len-1] == 0并缩减len,避免输出多余零。
实际代码片段示意(C++)
struct BigInt {
int d[100005]; // 逆序存,d[0]是个位
int len;
BigInt() : len(1) { memset(d, 0, sizeof(d)); }
};
BigInt mul(const BigInt& a, const BigInt& b) {
BigInt c;
for (int i = 0; i < a.len; i++) {
int carry = 0;
for (int j = 0; j < b.len || carry; j++) {
int s = c.d[i+j] + a.d[i] * b.d[j] + carry;
c.d[i+j] = s % 10;
carry = s / 10;
}
}
c.len = a.len + b.len;
while (c.len > 1 && c.d[c.len-1] == 0) c.len--;
return c;
}
BigInt qpow2(int n) { // 计算 2^n 的完整大数
BigInt res, base;
res.d[0] = 1; res.len = 1; // res = 1
base.d[0] = 2; base.len = 1; // base = 2
for (int exp = n; exp; exp >>= 1) {
if (exp & 1) res = mul(res, base);
base = mul(base, base);
}
return res;
}数组在这里不是可选项,而是承载数值本质的容器。它把“状态”从抽象的数学幂,落地为内存中可寻址、可操作的一串数字。

















