思想
二分方法降低求幂问题的时间复杂度。
以2的31次方为例:
而可以由
得到,
可以由
得到。
我们的目标就是将分解成若干个
的
的积,并尽可能减少分解结果的个数。这就是二进制数分解。
循环次数 | a(下一位的权重) | b(当前待分解) | ans |
0 | 31 | 1 | |
1 | 15 | ||
2 | 7 | ||
3 | 3 | ||
4 | 1 | ||
5 | 0 |
#include<iostream>
using namespace std;
int main(void)
{
int a,b;//求a的b次方
while(cin>>a>>b){
if(a==0&&b==0) break;
int ans = 1;//保存最终结果
while(b!=0){//若b不是0,说明二进制转换没有结束
if(b%2==1){
//如果当前二进制位是1,需要累乘a的2^k次方到ans中
//其中2^k是当前二进制位的权重
ans = ans*a;
ans = ans % 1000;
}
b=b/2;
a = a*a;//求下一位二进制的权重,a求平方
//依次是2^1,2^2,2^4
a = a%1000;
}
cout<<ans<<endl;
}
return 0;
}