在计算机中如何快速计算整数的N次幂(N为正整数)
我们最先想到的是使用for循环去一个一个相乘
(有n个x)
这个是最基本的想法
还有另一个想法就是使用相同底数相乘 幂相加的原理
=
而且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的下一个指数幂为多少