按二进制拆

10 分钟

朴素地算 要连乘 13 次,指数一大就慢得离谱。快速幂的核心思想是:把指数按二进制拆开。任何整数都能唯一写成 2 的幂之和,因为它本来就是二进制存的。比如 ,于是

这一串,每个都是前一个的平方,一路平方就能全拿到。指数的二进制里哪一位是 1,就把对应的那一项乘进答案。

// 看 13 的二进制哪几位是 1
int n = 13;
while (n) {
    cout << (n & 1);  // 取最低位
    n >>= 1;          // 右移一位,相当于除以 2
}
// 从低位到高位输出 1 0 1 1

原来要 次乘法,现在只需约 次。 时朴素法要十亿次,快速幂只要 30 次左右。坑:用 n & 1 判断奇偶、n >>= 1 除以 2,注意负指数要单独处理。

小纸条

把指数 10 拆成 2 的幂之和。

登录 后可看答案

按二进制拆 · 考级冲刺 · op599 课程