1. 递归版:
int RecursiveQuickPow(int base,int expo)
{
if(expo==0)
{
return 1;
}
if(expo%2)
{
return RecursiveQuickPow(base*base,expo/2)*base;
}
return RecursiveQuickPow(base*base,expo/2);
}
2. 迭代版:
int NonRecursiveQuickPow(int base,int expo)
{
int result=1;
while(expo)
{
if(expo&1)
{
result=result*base;
}
base=base*base;
expo=expo/2;
}
return result;
}
解析:以下以求a的b次方来介绍。
把b转换成二进制数。该二进制数第i位的权为。例如,11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1。因此,我们将a¹¹转化为算
3. 时间复杂度为:O(logN);空间复杂度为O(1)。很明显,N每次至少减少一半,故为O(logN)。
4. 测试程序:
#include<iostream>
using namespace std;
int RecursiveQuickPow(int base,int expo);
int NonRecursiveQuickPow(int base,int expo);
int main()
{
int base,expo,test=10;
while(test--)
{
cin>>base>>expo;
cout<<"递归快速幂的结果为:"<<RecursiveQuickPow(base,expo)<<endl;
cout<<"非递归快速幂的结果为:"<<NonRecursiveQuickPow(base,expo)<<endl;
}
return 0;
}
int RecursiveQuickPow(int base,int expo)
{
if(expo==0)
{
return 1;
}
if(expo%2)
{
return RecursiveQuickPow(base*base,expo/2)*base;
}
return RecursiveQuickPow(base*base,expo/2);
}
int NonRecursiveQuickPow(int base,int expo)
{
int result=1;
while(expo)
{
if(expo&1)
{
result=result*base;
}
base=base*base;
expo=expo/2;
}
return result;
}
运行示例:
2 10
递归快速幂的结果为:1024
非递归快速幂的结果为:1024
3 5
递归快速幂的结果为:243
非递归快速幂的结果为:243
5 9
递归快速幂的结果为:1953125
非递归快速幂的结果为:1953125