其他分享
首页 > 其他分享> > 数值的整数次方

数值的整数次方

作者:互联网

数值的整数次方

题目链接

牛客网

题目描述

实现函数 double Power(double base, int exponent),求base的exponent次方。

注意:

1.保证base和exponent不同时为0。

2.不得使用库函数,同时不需要考虑大数问题

3.有特殊判题,不用考虑小数点后面0的位数。

数据范围: imgimg ,保证最终结果一定满足 img
进阶:空间复杂度 img ,时间复杂度 img

示例1

输入:

2.00000,3

返回值:

8.00000

示例2

输入:

2.10000,3

返回值:

9.26100

示例3

输入:

2.00000,-2

返回值:

0.25000

说明:

2的-2次方等于1/4=0.25

题目分析

第一种写法(一个数的负次方即为这个数的正次方的倒数)

因为所有数往下除以2最后都能被分解为1和0,所以对于0次幂,返回1,对于1次幂返回base,剩下的就除以二往下分解。
负数次幂就是把base变为1/base,然后-exp次幂即可

public static double power(double base, int exponent) {
        return exponent > 0 ? quickPow(base, exponent) : quickPow(1 / base, -exponent);
    }

    public static double quickPow(double base, int exp) {
        if (exp == 0) {
            return 1;
        }
        if (exp == 1) {
            return base;
        }
        return power(base, exp / 2) * power(base, exp - exp / 2);
    }

第二种写法(一个数的负次方即为这个数的正次方的倒数)

最直观的解法是将 x 重复乘 n 次,x*x*x...*x,那么时间复杂度为 O(N)。因为乘法是可交换的,所以可以将上述操作拆开成两半 (x*x..*x)* (x*x..*x),两半的计算是一样的,因此只需要计算一次。而且对于新拆开的计算,又可以继续拆开。这就是分治思想,将原问题的规模拆成多个规模较小的子问题,最后子问题的解合并起来。

本题中子问题是 xn/2,在将子问题合并时将子问题的解乘于自身相乘即可。但如果 n 不为偶数,那么拆成两半还会剩下一个 x,在将子问题合并时还需要需要多乘于一个 x。

因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。

public static double Power(double x, int n) {
        boolean isNegative = false;
        if (n < 0) {
            n = -n;
            isNegative = true;
        }
        double res = pow(x, n);
        return isNegative ? 1 / res : res;
    }

    private static double pow(double x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n == 1) {
            return x;
        }
        //
        double res = pow(x, n / 2);
        res = res * res;
        if (n % 2 != 0) {
            res *= x;
        }
        return res;
    }

标签:return,exponent,double,数值,base,整数,res,次方
来源: https://www.cnblogs.com/congratulations/p/15792487.html