数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

在设计算法的时候,我们需要考虑如下几个特殊情况:
1)指数为0,这时不管基数是多少,最终结果都为1(0的0次方是多少?)。
2)指数为负数,计算过程类似于指数为正的情况,但最终结果需要取倒数。

以计算9的10次方为例:
1)最简单的一种思路是循环,循环10次,每次都将结果乘以9,缺点是复杂度高达O(N)。
2)一种相对比较巧妙的思路是利用数学,将计算过程拆分为9的8次方乘以9的2次方。
先将10写成二进制形式1010,从后面往前扫描,每扫描一位就将基的大小翻倍,遇到1就将结果乘以基。

9的10次方的计算过程

扫描右边第一个0时仅将9翻倍为81,扫描右边第一个1时将81乘以结果(默认是1)并将81翻倍为9的4次方,扫描右边第二个0时仅将9的4次方再次翻倍得到9的8次方,扫描最左边第一个1时将9的8次方乘以结果,扫描完毕,计算完成。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public double Power(double base, int exponent) {
if (exponent == 0) {
return 1;
}

double result = 1, b = base;

int exp = exponent >= 0 ? exponent : -exponent;

while (exp > 0) {
if ((exp & 1) == 1) {
result *= b;
}

b *= b;
exp >>= 1;
}

return exponent > 0 ? result : 1 / result;
}

该算法的复杂度为O(LogN)。