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

模幂运算Java代码解析:负数底数处理与最终取模疑问解答

模幂运算Java代码的两个核心疑问解答

先把你的代码贴出来,方便咱们对照着分析:

public class Solution {
    public int pow(int x, int n, int d) {
        long ans;
        if(x==0) return 0;
        if(n==0) return 1;
        if(x<0) return pow(d+x,n,d);
        long temp = pow(x,n/2,d);
        if(n%2==0) ans = ((temp%d)*(temp%d))%d;
        else ans = ((((x%d)*(temp%d))%d)*(temp%d))%d;
        return (int)ans%d;
    }
}

接下来咱们逐个拆解你的两个疑问:

疑问1:为什么x为负数时要调用pow(d+x, n, d)?

这是利用了模运算的等价性规则:对任意整数x和正整数d,x ≡ (d + x) mod d。举个实际例子,比如x=-3,d=7,-3模7的结果是4,而7+(-3)=4,4模7的结果也是4,两者完全等价。

这么做的核心目的是把负数底数转换成正数,避免后续递归计算中出现负数相乘、符号混乱的问题,同时保证最终模运算的结果和原负数底数的计算结果完全一致——毕竟模幂运算的本质是求x^n mod d,只要底数在模d的意义下等价,最终结果就不会变。

疑问2:为什么中间多次取模后,最后还要执行(int)ans%d?

咱们从两个关键场景来理解:

  1. 修正n=0的特殊情况:代码里当n=0时直接返回1,但如果d=1,正确结果应该是1 mod 1 = 0而非1。这时候最后的取模操作就会把1修正为0,保证结果符合模运算的规则。
  2. 兜底确保结果范围正确:虽然中间计算都用%d约束了数值,但ans是long类型,转成int时可能遇到极端情况(比如d为负数,或者递归返回值因溢出出现异常),最后的取模能把结果强行拉回x^n mod d的正确区间内。

简单说,这一步是给结果加了最后一道保险,确保无论中间过程出现什么特殊情况,返回值都是严格符合要求的模运算结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:33:12