整数快速幂

在计算机中如何快速计算整数的N次幂(N为正整数)

我们最先想到的是使用for循环去一个一个相乘

x^{n}=x*x*x*...x   (有n个x)

这个是最基本的想法

还有另一个想法就是使用相同底数相乘  幂相加的原理

x^{19}=x^{16}*x^{2}*x^{1}=x^{16+2+1 }

而且19的二进制正好为10011            而16的二进制为10000    同理  2    10   ,1   为1      

利用这个规律我们可以写出这样的程序

int QuickPow(int int N)
{
    int ans=1;
    int res=x;
    while(N)
    {
        if(N&1) //判断是否为奇数效果比m%2==1好    这里使用的是与操作符
            {
                ans=ans*res;
            }
            res=res*res;      //这里相当于是(x^i)^2   
        N=N>>1;
    }
    return ans;
}

N>>1   N左移一位相当于除以2

对于X^19来说:
19的二进制为:1 0 0 1 1
初始:

ans = 1; res = x;

则10011最后一位是1,所以是奇数。

 ans = res*ans = x; 
res = res*res = x^2;

然后右移一位,1 0 0 1
则1001最后一位是1,所以是奇数

    ans = res*ans = x*(x^2) = x^3     
res = res*res = x^2*x^2 = x^4

然后右移一位,1 0 0
则最后一位是0,所以当前的数为偶数。

    res = res*res = x^4*x^4 = x^8

然后右移一位,1 0
最后一位是0,当前数是偶数。

    res = res*res =x^8*x^8= x^16

然后右移一位,1
最后一位是1,当前数是奇数

    ans = ans*res = (x^3)*(x^16) = x^19
    res = res*res = x^32

可以看出res = X^m,m 始终是与二进制位置上的权值是相对应的。当二进制位为0时,我们只让resres使幂指数2.对应下一个二进制位的权值,当二进制位为1时,ans = ans*res 。则乘上了该乘的X幂次。

res的作用是计算x的下一个指数幂为多少   

猜你喜欢

转载自blog.csdn.net/zpc17875305019/article/details/84424963