刷王道机试题小记:快速幂
例如求3^29,由观察知,
3^29 = 3
×
\times
× 3^28 = 3
×
\times
× 3^4
×
\times
× 3^8
×
\times
× 3^16,
其中分开的这几项都可以由前一项平方得到,减少了运算次数
那么如何知道要拆成几项呢?因为一个数总可以写成 2^k 的和,即表示成二进制的形式,29 = 11101 = 2^0 +2^2 + 2^3 + 2^4 = 1+4+8+16,故可以用求二进制的方法,每次平方,若二进制位上的数字为1,则将此次平方结果累加到最终所求中。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
int fastExponent(int a,int b)
{
int answer = 1;
while(b != 0){
if( b%2 == 1 ){
answer *= a;
}
a *=a;
b /=2;
}
return answer;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b) != EOF)
{
if(a==0 && b == 0)
break;
printf("%d\n",fastExponent(a,b));
}
}