在指数平方中进行递归的工作?

时间:2015-03-05 17:32:28

标签: c++ recursion exponential

我正在阅读指数平方法,以便从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或最后一步。

1 个答案:

答案 0 :(得分:1)

你的问题有点令人困惑,所以我实际上并不知道你要问的是什么,但我确实看到你的代码有三个主要问题:

  • pow浮点取幂,这意味着当数字足够大时,您将获得舍入错误。当您尝试进行精确的整数运算时,您无法使用它。
  • 您似乎试图以特定的30位模数进行算术运算,这意味着将三个减少的数量相乘(例如,将一个数字平方,然后乘以另一个数字)将得到最大为90位的结果,从而溢出long long,因为它可能只是64位类型。
  • 您使用的是签名类型,但您的所有代码似乎都假设您的所有数字都是非负数。