/*快速幂
输入a,b,求a^b
*/
#include<iostream>
using namespace std;
int ksm(int a, int b)
{
if (b == 0)
return 1;
if (b == 1)
return a;//递归终止条件
else
return(ksm(a, b / 2)*ksm(a, b / 2)*ksm(a, b % 2));//将a^b分成a^(b/2)*a^(b/2),b%2判断b是否刚好为2的整倍数,是的话ksm(a,b%2)返回1,否则返回a
}//递归法
int ksm(int a, int b, int ans)
{
while (b)
{
if (b % 2 == 0)
{
b = b / 2;
a = a * a;
}
else {
b = b - 1;
ans=ans*a;
}
}
return ans;
}//递推法
int main()
{
int a;
int b;
int ans = 1;
cin >> a;
cin >> b;
ans = ksm(a, b, ans);
cout << ans << endl;
ans= ksm(a, b);
cout << ans<< endl;
system("pause");
return 0;
}
a^b可以看作a^b/2*a^b/2,a^b/2可以看作a^b/4*a^b/4,所以可以用递归的方法见将a^b简化
注意递归的结束条件:
当指数为0是,与底数无关,a^b恒为1
b被分为b/2与b/2,b/2被分为b/4与b/4,最终被分成1
注意:b/2只能取整,所以当b为奇数是,要多乘以一个底数