leetcode-50 Pow(x, n) 剑指Offer题11 数值的整数次方

问题描述:

给定一个double类型的浮点数baseint类型的整数exponent。求baseexponent次方。Pow(X,n)

问题分析:

问题首先要考虑输入值的合法性,0的0次方可以返回1,可以视作是合法的;但0的负数次幂则是没有意义,因此需要单独挑出来;

此外,double类型数据的比较最好采用相减不大于某个极小值(比如0.00000001)来表示相等,最好不要使用==;

 

计算一个数的x的n次方,首先要考虑n是否为正数,当n为负数时,将n取为-n转化成正数,x取其倒数1/x(注意去除底数为0的情况,底数为0,n为正时,结果始终返回0);则原问题即转化为pow(1/x,-n)的情况,指数统一的划为正数;

 

计算幂时,采用x连乘n次的效率太低,可以考虑“二分法”;即:


代码:

递归解法:

public class Solution {
    private final static double MAX_DIS = 0.000000001;

    public double myPow(double x, int n) {
        // 不合法情况:当底数为0,指数为负值时
        if (isEqual(x, 0.00) && n < 0) return 0.00;
        return power(x, n);
    }

    private double power(double x, int n) {
        if (n == 0) return 1.0;
        if (n < 0) {
            n = -n; x = 1.0 / x;
        }
        double temp = power(x, n / 2);
        return (n & 0x1) == 1 ? (temp * temp * x) : (temp * temp);
    }

    // 判断两个double类型的数值是否相同,不能仅仅使用==来判断
    private boolean isEqual(double a, double b) {
        return (Math.abs(a - b) < MAX_DIS);
    }
}

 

非递归解法:

    private double power(double x, int n) {
        if (n < 0) {
            n = -n; x = 1.0 / x;
        }
        double result = 1.0;
        for (double base = x;n > 0; n >>= 1) {
            if ((n & 0x1) == 1)
                result *= base;
            base *= base;
        }
        return result;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值