You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中不使用**运算符实现求幂(乘法方式)

不用**运算符实现大数值求幂的方案

嘿,刚好我之前也处理过类似的大数类求幂问题,给你分享个靠谱的思路:快速幂算法(二进制幂运算),它完全不需要依赖**运算符,只用到你已经重载好的*(或者*=),而且效率极高,特别适合你说的超大数值场景。

快速幂到底是什么?

简单来说,就是把指数拆成二进制来算。比如算a^10,10的二进制是1010,也就是8+2,那a^10 = a^8 * a^2。这样我们只需要做几次平方(a→a²→a⁴→a⁸),再把对应二进制位为1的项乘起来就行,比傻循环乘10次快多了——指数越大,省的乘法次数越多,对大数来说能避免很多不必要的性能开销。

适配你重载类的代码示例

假设你的大数类叫BigNum,已经正确实现了operator*或者operator*=(后者更推荐,因为能减少临时对象),再加上一个返回单位元(也就是1)的方法,那求幂函数可以这么写:

// 先给个你的类的简化示例:
class BigNum {
public:
    // 构造函数、其他方法...
    BigNum operator*(const BigNum& rhs) const;
    BigNum& operator*=(const BigNum& rhs);
    // 返回1,因为任何数的0次幂都是1
    static BigNum get_one();
};

// 求幂函数:base是底数,exponent是正整数指数
BigNum my_pow(BigNum base, unsigned long long exponent) {
    BigNum result = BigNum::get_one();
    
    while (exponent > 0) {
        // 如果当前指数的二进制最后一位是1,就把当前base乘到结果里
        if (exponent % 2 == 1) {
            result *= base;
        }
        // 底数平方,指数除以2(相当于右移一位)
        base *= base;
        exponent /= 2;
    }
    
    return result;
}

几个要注意的点

  • 0次幂的处理:上面的代码里,当exponent是0时,直接返回1,这符合数学定义,不管你的底数是什么大数都适用。
  • 负指数的支持:如果需要算负指数,你得给BigNum加除法或者倒数的重载(比如operator/或者reciprocal()方法),然后把负指数转成正指数计算,再取倒数就行:my_pow(base, -exponent).reciprocal()。
  • 效率优化:一定要用operator*=代替operator*,因为*会创建新的临时对象,对于超大数来说,内存和时间开销都会大很多。
  • 调试建议:先拿小指数测试,比如my_pow(a,3)应该等于a*a*a,确认你的*重载没问题,再去测大指数和超大数值的情况。

你之前重载pow没成功,大概率是用了普通的循环乘法(效率低还容易出问题)或者不小心用到了内置的**,换成快速幂应该就能解决啦。

内容的提问来源于stack exchange,提问作者MTG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:24:52