ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数值的整数次方

2022-01-12 14:31:30  阅读:140  来源: 互联网

标签:return exponent double 数值 base 整数 res 次方


数值的整数次方

题目链接

牛客网

题目描述

实现函数 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有