求 x 的 n 次幂。pow函数的自实现方法之一。
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]
直接for循环在n较大时会超时,且效率很低,如 2^4 将化为 2*2*2*2= 4*2*2= 8*2 = 16,存在重复计算,实际上计算出2*2=4后,便可直接化为4*4=16。
在此选择将n化小,将x增大,如2^80 = 4^40 = 16^20,可以减少循环次数。
class Solution {
public:
double myPow(double x, int n)
{
unsigned int m;
double res=1;
if (x==1)
return 1;
if (n==-2147483648) //化为正数时超出int的表示范围
m = 2147483648;
else
m = n>=0? n : -n;
x = n>=0? x : 1/x;
while (m>100) //x是底数,m是指数,设置最后循环次数为100,也可设置为别的较小数
{
if (m%2==1) //如果指数为奇数,先乘一个到结果中。
res *= x;
m = m/2;
x = x*x;
}
for (int i=0;i<m;++i)
res *= x;
return res;
}
};