和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ12 数值的整数次方

原题链接


描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。


示例

输入:2.00000,-2
返回值:0.25000
说明:2的-2次方等于1/4=0.25

思路

最初始的想法自然是 for 循环了,不过要注意指数为 0,底是 0 指数是负数的这些特殊情况。然后就有了改进方法:26 等于 23 * 23,27 等于 23 * 23 * 2 也就是基数。这样时间复杂度就变成了O(log2n)。

解答

public class Solution {
    public double Power(double base, int exponent) {
        if (base == 0 && exponent <= 0) return 0;
        
        double res = 1.0;
        if (exponent < 0) {
            base = 1 / base;
            exponent=-exponent;
        }
        for (int i = 0; i < exponent; i++) {
            res = res * base;
        }
        return res;
    }
}

优化

public class Solution {
    public double Power(double base, int exponent) {
        if (base == 0 && exponent <= 0) return 0;
        if (exponent == 0) return 1;

        if (exponent < 0) {
            base = 1 / base;
            exponent = -exponent;
        }
        double res = MyPower(base, exponent);
        return res;
    }

    public double MyPower(double base, int exponent) {
        if (exponent == 1) return base;

        double res = MyPower(base, exponent >> 1);
        res *= res;
        System.out.println(res);

        if ((exponent & 1) == 1)
            res *= base;

        return res;
    }
}

更好理解的递归版本

class Solution {

    public double myPow(double x, int n) {
        if (x == 0) return 0;
        long b = n;
        return recur(x, n);
    }

    public double recur(double x, long n) {
        if (n == 0) return 1;

        if (n < 0)
            return recur(1 / x, -n);
        else if ((n & 1) == 0)
            return recur(x*x, n / 2);
        else
            return x * recur(x, n - 1);
    }
}
posted @ 2021-08-18 23:05  klaus08  阅读(47)  评论(0编辑  收藏  举报