神奇的快速幂
快速幂顾名思义,就是快速算某个数的多少次幂。
其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
例如 计算result=a^11
普通的方法:
result=a*a*a..*a*a(11个a相乘) ,计算了11次。
快速幂的方法:
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
a^(2^0) * a^
(2^1) * a^
(2^3),即 a^1 * a^2 * a^8,这样只需要计算4次(2³ 2² 2¹ 2º)。
以下是计算n^m次方的快速幂代码:
#include <stdio.h>
int main()
{
long long n,m;
while(scanf("%lld %lld",&n,&m)){
long long result=1,temp=n; //temp即模拟二进制从低位到高位
while(m){ //注意m temp是同步的。
if(m%2) result*=temp;//若该位为1,则乘一个temp
temp*=temp;
m/=2;
}
printf("%lld\n",result);
}
return 0;
}