C 如何编写时间复杂度为O(logn)的计算m^n的迭代版本?

C 如何编写时间复杂度为O(logn)的计算m^n的迭代版本?,c,algorithm,C,Algorithm,如果我有两个整数m和n,并且我必须计算幂(m,n),即mn,那么我编写了下面的递归代码,它的时间复杂度为O(logn),但我无法编写它的迭代版本,它给出了类似的时间复杂度 int power(int m, int n) { int p; if (n == 1) return m; p = power(m, n / 2); if (n % 2 == 1) return p * p * m; else retu

如果我有两个整数
m
n
,并且我必须计算
幂(m,n)
,即mn,那么我编写了下面的递归代码,它的时间复杂度为O(logn),但我无法编写它的迭代版本,它给出了类似的时间复杂度

int power(int m, int n) {
    int p;
    if (n == 1)
        return m;
    p = power(m, n / 2);
    if (n % 2 == 1) 
        return p * p * m;
    else
        return p * p;
}

如果
n
的最小位为
1
m
乘以结果。
如果
n
的第二个最小位是
1
m*m
乘以结果。
如果
n
的第三个最小位是
1
,则将
(m*m)*(m*m)
乘以结果

重复此操作,代码应如下所示:

int power(int m, int n)
{
    int res = 1;
    while (n > 0) /* check all bit which is 1 */
    {
        if (n % 2 == 1) res *= m; /* check current bit */
        m *= m; /* calculate what to multiply if next bit is 1 */
        n >>= 1; /* proceed to next bit */
    }
    return res;
}

是否有一些限制阻止您使用库函数?没有,但我想尝试使用递归函数definition@AndrewMorton:可能是因为
pow
是浮点?并使用浮点库/模拟来扩充代码?世界上没有FPU的系统比没有FPU的系统多得多。你能解释一下这个m=m*m步骤吗,我举了一个例子(3,4),然后我得到了最后的m,计算为81*81,那么这背后有什么逻辑吗?3^4=(3^2)^2=((3^2)^2)^1实际上,81*81的结果没有被使用。注意:我已经使用了模运算符,为什么不将
n
除法而不是移位呢?如果(n&1)在
n
有符号且编译器可能检测不到
n
为正时,使用
if(n&1)
而不是
if(n%2==1)
会更有效。对于一般签名的情况,
n%2
的代码更长。我喜欢将其视为
a^b=(a*a)^(b/2)