【问题标题】:bigmod function returns negative value [closed]bigmod 函数返回负值
【发布时间】:2020-07-20 05:33:34
【问题描述】:
long long int big_mod(long long int base, long long int power, long long int mod)
{
    if(power==0)    return 1;
    else if(power%2==1)
    {
        int p1 = base % mod;
        int p2 = (big_mod(base,power-1,mod))%mod;
        return (p1*p2)%mod;
    }
    else if(power%2==0)
    {
        int p1 = (big_mod(base,power/2,mod))%mod;
        return (p1*p1)%mod;
    }
}

此函数为 (3 140068687 419634856) 输入返回负值。 为什么会这样?谁能解释一下。

【问题讨论】:

  • 因为你的乘法溢出了。
  • 我应该在我的代码中进行哪些更改以获得这些输入的正确值? @Barmar
  • 你需要研究模算术的数学,看看是否有办法在不做乘法的情况下做到这一点。
  • 您没有添加头文件,这可以帮助我们确定您的计算限制。基本上,您的限制受 CPU 架构和编译器能力的限制。您可以使用 lldb 或 gdb 在累加器中查看结果。那么你可以确定它是溢出还是别的什么

标签: c bigmod


【解决方案1】:

返回的值可能太大(p1*p2p1*p1),导致程序溢出。

使用(A * B) mod C = (A mod C * B mod C) mod C计算模

所以你可以改变返回值:

else if(power%2==1)
{
     ...
     return ((p1%mod) * (p2%mod))%mod;
}
else if(power%2==0)
{
     ...
     return ((p1%mod) * (p1%mod))%mod;
}

【讨论】:

  • 谢谢。它有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多