版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hang404/article/details/85240417
题目描述:
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
题目解答:
方法1:移位法
每次将n
分解为两部分,一部分是2t,另一部分是n - 2^t
;这样pow(x, n) = pow(x, 2^(t-1)) * pow(x, 2^(t-1)) * pow(x, n - 2^t)
。但逻辑还是有点混乱,感觉有点麻烦,需要将x
和n
都转为正数,而且效率不够高。
运行时间4ms,代码如下。
#define DOUBLE_ZERO 0.0000001
double MyPow(double x, int n) {
if(n == 0)
return 1;
if(n == 1)
return x;
int i = 1;
while(i <= n) {
i = i << 1;
}
i = i >> 1;
double temp = MyPow(x, i / 2);
if(temp <= DOUBLE_ZERO)
return 0;
return temp * temp * MyPow(x, n - i);
}
double myPow(double x, int n) {
if(x == 0)
return 0;
double flag = 1;
if(x < 0 && (n & 1)) {
x = -x;
flag = -1;
}
else if(x < 0)
x = -x;
if(-DOUBLE_ZERO + 1 <= x && x <= DOUBLE_ZERO + 1)
return flag * x;
if(n == INT_MIN)
return 0;
if(n < 0) {
x = 1 / x;
n = -n;
}
if(x < 0.1 && n >= 6)
return 0;
return flag * MyPow(x, n);
}
方法2:二分法
如果n
为偶数,则pow(x, n) = pow(x * x, n / 2)
;如果n
为奇数,则pow(x, n) = x * pow(x * x, n / 2)
;这样每次都可以折半,效率比较高。
运行时间4ms,代码如下。
double myPow(double x, int n) {
```c
if(n == 0)
return 1;
if(n == INT_MIN && (x == 1 || x == -1))
return 1;
if(n == INT_MIN)
return 0;
if(n < 0) {
x = 1 / x;
n = -n;
}
return ((n & 1 ? x : 1.0) * myPow(x * x, n / 2));
}