leetcode--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, 2311]

题目链接:https://leetcode-cn.com/problems/powx-n


解题思路1:

1、采用快速幂的做法,如果 n 是偶数,则 Pow(x, n) = Pow(x, n/2) * Pow(x, n/2)
如果 n是奇数,则 Pow(x, n) = Pow(x, n-1) * x
2、需要注意一些特殊情况,当 n<0, n=0, n=1 的情况需要提前处理


代码1:

class Solution(object):
    def myPow(self, x, n):
        if n < 0:
            x = 1.0/x
            n *= -1
        elif n == 0:
            return 1
        elif n == 1:
            return x

        if ( n % 2 == 0):
            half = self.myPow(x, n/2)
            return half * half
        else:
            return (self.myPow(x, n-1)) * x

测试代码示例:

s = Solution()
x = 2.00000
y = -2
print(s.myPow(x,y))

代码2:

#include<iostream>
using namespace std;


double myPow(double x, long n) {
    if(n<0){
        x = 1.0/x;
        n *= -1;
    }else if(n==0){
        return 1;
    }else if(n==1){
        return x;
    }

    if(n%2==0){
        double half = myPow(x, n/2);
        return half*half;
    }else{
        return myPow(x, n-1) * x;
    }
}

int main()
{
	double x;
	long y;
	x = 2.00000;
	y = -2;
	cout << myPow(2.00000,-2) << endl;

	return 0;

}

解题思路2:

使用递归算法解决


python:

class Solution(object):
    def myPow(self, x, n):
        if n == 0: return 1
        if n < 0:  return 1/self.myPow(x, -n)
        ans = self.myPow(x, n/2)
        if n % 2 == 0:
            return ans*ans
        else:
            return ans*ans*x

来源于: leetcode

class Solution:
    def myPow(self, x, n):
        def quickMul(N):
            if N == 0:
                return 1.0
            y = quickMul(N // 2)
            return y * y if N % 2 == 0 else y * y * x
        
        return quickMul(n) if n >= 0 else 1.0 / quickMul(-n)

C++:

//递归算法
class Solution {
public:
    double myPow(double x, long n) {
        if(n == 0) return 1;
        if(n < 0) return 1/myPow(x,-n);
        double ans = myPow(x,n/2);
        if(n % 2 == 0)
        {
            return ans*ans;
        }
        else{
            return ans*ans*x;
        }
    }
};

解题思路3: 暴力方法,超出时间限制

class Solution {
public:
    double myPow(double x, int n) {
        int sign = (n > 0)?1:-1;
        double ans = 1;
        n = abs(n);
        while(n-- > 0)
            ans *= x;
        return (sign == 1)?ans:1/ans;
    }
};

参考链接:
leetcode 50. Pow(x, n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值