由于math.h中pow的运算量较大,在计算较大的幂运算时容易导致程序运行时间过长。
因此,在此引入一种被称为快速幂的算法。
仅适用于指数为整数的情况。
如:3的五次方可以如上图展开原本可能要执行5次循环的运算(或使用泰勒展开进行更复杂的运算),可以把指数按二进制展开来简化运算。
如,计算a的b次方
用p来存储运算结果,先令p=1
开始检查b按2进制展开的第一位(最右边那位)
如果是1,就把p*=a,并把a*=a以预备下一次运算
如果是0,就不对p作运算,但仍把a*=a以预备下一次运算
再检查b按二进制展开的下一位,以此往复直到检查到b的最后一位
而这个对b检查的实现
可以用b%2==1和b/=2来实现(还记得如何把一个数从个位到最高位依次输出吗?2进制也类似,只不过把10换成了2)
出于2进制的特殊性,我们也可以使用C语言专门为2禁止运算准备的按位运算符
b%2==1可以替换为b&1==1,即将二进制数最低位与1作与运算,当且仅当同为1时为真,由于该式子的结果不是1就是0,所以也可以直接把“==1”去掉
而b/=2可以替换为b>>=1即把二进制数整体向右移一位,多出来的位补0(即相当于/=2)
代码如下:
int fastpow(int a,int b)//求a的b次方
{
int p=1; //存储结果
while(b)
{
if(b&1) p*=a;
b>>=1;
a*=a;
}
return p;
}