我正在阅读指数平方法,以便从codechef教程中快速乘法,我对这种方法有很多疑问
long long int fast_exp(int base, int exp)
{
if(exp==1)
return base;
else
{
if(exp%2 == 0)
{
long long int base1 = pow(fast_exp(base, exp/2),2);
if(base1 >= 1000000007)
return base1%1000000007;
else
return base1;
}
else
{
long long int ans = (base* pow(fast_exp(base,(exp-1)/2),2));
if(ans >= 1000000007)
return ans%1000000007;
else
return ans;
}
}
}
我怀疑这种方法是在每次递归步骤执行'%'操作,还是在计算实际 base ^ exp 后执行。我个人认为它在最后一步计算%,当我运行此代码时
base=345 and exp=246;
它给了我垃圾值。
我想知道当'%'操作正在进行时,在everystep或最后一步。
答案 0 :(得分:1)
你的问题有点令人困惑,所以我实际上并不知道你要问的是什么,但我确实看到你的代码有三个主要问题:
pow
是浮点取幂,这意味着当数字足够大时,您将获得舍入错误。当您尝试进行精确的整数运算时,您无法使用它。long long
,因为它可能只是64位类型。