leetcode题解50-Pow(x,n)

76 篇文章 1 订阅

问题描述

实现 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 位有符号整数,其数值范围是 [−2^31, 2 ^31 − 1] 。

解题思路

求x的n次方,显然,利用for循环,每次让x相乘即可,但是本题有很多细节,如n为负时计算可以先求为取相反数后计算得到的倒数,但是当n=−2^31,直接取相反数会导致溢出,当n为负时,本题如果直接让x循环n次的话会造成超时,所以每次循环都可以判断结果是否趋近于0,如果趋近于0,就可以返回0。同时还有许多其它的情况也需要考虑到,具体见下面代码。

代码实现

class Solution {
    public double myPow(double x, int n) {
        //当x为1的时候(注意,浮点数不能直接等于),不管多少次放,都返回1
		if((x>0.9999999)&(x<1.0000001)){
			return x;
		}
		//当x为-1的时候
		if((x>-1.000001)&&(x<-0.999999)){
			if(n%2==0){
				return (-x);
			}else{
				return x;
			}
		}
		double result=x;		
		//任何数的0次方都为1
		if(n==0){
			return 1;
		}else if(n<0){
			//当n为-2的31次方
			if(n==-2147483648){
				//需要相乘2147483648次
				for(int i=0;i<=2147483647;i++){
					result=result*result;
					double temp=(double)(1/result);
					//当此时的乘积接近为0,就返回0
					if((temp<0.000001)&&(temp>0)){
						return 0.00000;
					}
				}
			}else{
				int m=-n;		//取相反数,然后相乘。
				for(int i=1;i<m;i++){
					result=result*x;
					double temp=(double)(1/result);
					if((temp<0.000001)&&(temp>0)){
						return 0.00000;
					}
				}
			}
			//最后取倒数
			result=(double)(1/result);
		}else{
			for(int i=1;i<n;i++){
				result=result*x;
			}
		}
		return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值