【每日leecode】Leecode 50. Pow(x, n)

实现 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] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力法

应该是会超时的,On解法

go代码

func myPow(x float64, n int) float64 {
    if n == 0 {
        return 1
    }
    if n < 0 {
        return 1/violencePow(x, -n)
    }
    return violencePow(x,n)
}

func violencePow(x float64, n int) float64 {
    var ans float64
    ans = 1
    for n > 0 {
        ans *= x 
        n--
    }
    return ans
}

快速幂,递归

思路: 对于计算 x 的n次方,可以先对n进行降级 比如 2 的10次方 其实是 2^5 * 2^5 = 2^2*2 * 2^2*2

go代码

func myPow(x float64, n int) float64 {
    if n < 0 {
        return 1/fastPow(x, -n)
    }
    return fastPow(x, n)
}

func fastPow(x float64, n int) float64 {
    if n == 0 { //0次幂等于1
        return 1
    }
    y := fastPow(x, n>>1) //n>>1 = n/2
    if n&1 == 1 { //n&1 = n%2
        return y * y * x //奇数多了一次 *x
    }
    return y * y
}

c++代码

class Solution {
public:
    double myPow(double x, int n) {
        long long N = n;
        //注意n为负数 返回结果要 1/
        return N < 0 ? 1/fastPow(x,-N) : fastPow(x, N);
    }

    double fastPow(double x, long long n) {
        if (n == 0) {
            return 1;
        }
        double y = fastPow(x, n>>1);
        return n&1 == 1 ? y * y * x : y * y;
    }
};

快速幂,迭代

go代码

func myPow(x float64, n int) float64 {
    if n < 0 {
        return 1/fastPow(x, -n)
    }
    return fastPow(x, n)
}

func fastPow(x float64, n int) float64 {
    var ans float64
    ans = 1
    for n > 0 {
        if n&1 == 1 { //拿出次方的最后一位,如果是 奇数表示需要将当前x的值累计到结果上
            ans *=x
        }
        x *=x //x在每次循环的时候都扩大一倍 = x^2
        n = n>>1 //n每次右移一位,由底位处理到高位,同时底数需要扩大一倍
    }
    return ans
}

c++代码

class Solution {
public:
    double myPow(double x, int n) {
        long long N = n;
        //注意n为负数 返回结果要 1/
        return N < 0 ? 1/fastPow(x,-N) : fastPow(x, N);
    }

    double fastPow(double x, long long n) {
        double ans = 1;
        while (n > 0) {
            if (n&1 == 1) ans*=x;
            x*=x;
            n = n>>1;
        }
        return ans;
    }
};

 

 

你可能感兴趣的:(每日leecode,c++,leetcode,算法,go)