求m的n次幂

碰到这么个小问题,不考虑输入为负,不考虑输出越界的情况下,求m的n次幂m^n。
1·最基本的算法,可以使用循环来搞定,时间复杂度为O(n):

1
2
3
4
5
6
7
8
9
10
int pow(int m,unsigned int n)
{
int result = 1;
while(n >0)
{
result *= m;
--n;
}
return result;
}

2·接着考虑,如果先计算出m²,求m^n的话,只需要循环(n/2+1)次:

1
2
3
4
5
6
7
8
9
10
11
int pow(int m, unsigned int n)
{
int result = 1;
int tmp = m * m;
while(n > 0)
{
result *= tmp;
}
if(n % 2)
result *= m;
}

3·明显,如果先计算出m^4的话,时间复杂度会进一步降低,改进版代码如下,时间复杂度为O(log2n):

1
2
3
4
5
6
7
8
9
10
11
12
13
int pow(int m, unsigned int n)
{
int result = 1;
int tmp = m;

while (n) {
if (n & 1)
result *= tmp;
tmp *= tmp;
n >>= 1;
}
return result;
}

使用递归的方式实现以上代码:

1
2
3
4
5
6
7
8
int (int m, unsigned int n)
{
int square_root = pow(m, n/2);
int result = square_root * square_root;
if (n & 1)
result *= m;
return result;
}

认知和思索,来源于生活的点点滴滴。