LeetCode 50. Pow(x, n) (C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)。但逻辑还是有点混乱,感觉有点麻烦,需要将xn都转为正数,而且效率不够高。
运行时间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));
}

猜你喜欢

转载自blog.csdn.net/hang404/article/details/85240417