• 剑指 Offer 16. 数值的整数次方


    实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    示例 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 位有符号整数,其数值范围是 [−231, 231 − 1] 。

    返回的结果肯定是double类型,base的exponent次方;最后需要判断exponent的正负,如果是负数就返回 1/res;否则返回res。

    当exponent是偶数的时候:比如(4,8)表示4的8次方;可以写成(4*4,8/2)即(16,4),所以可以推导出每次将exponent除以2,base*=base,最终到exponent=0为止。

    当exponent是奇数的时候:比如(2,7)等于2*(2*2,3)

    所以递归写法

    public double myPow(double x, int n) {
        //如果n等于0,直接返回1
        if (n == 0)
            return 1;
        //如果n小于0,把它改为正数
        if (n < 0)
            return myPow(1 / x, -n);
        //根据n是奇数还是偶数来做不同的处理
        return (n % 2 == 0) ? myPow(x * x, n / 2) : x * myPow(x * x, n / 2);
    }
    
    
    

    但是当n=Integer.MIN_VALUE的时候会报错,堆栈溢出,因为Integer.MIN_VALUE的相反数还是本身,这个解决方法就是

    if(n<0){
    	//如果n<0,x的n-1次方乘以(1/x)=x^-n
        return 1/x*myPow(1/x,-n-1);
    }
    

    非递归

    public double myPow(double x, int n) {
        double res= 1.0;
        for (int i = n; i != 0; i /= 2 ) {
            if (i % 2 != 0) {
                //i是奇数
                res*= x;
            }
            x *= x;
        }
        return n < 0 ? 1.0 / res: res;
    }
    
    
    
  • 相关阅读:
    Slf4j框架的用法
    常用框架介绍
    Spring整合Kafka(Spring-Kafka)
    Java并发容器
    kafka多线程消费
    kafka简介
    kafka-clients介绍
    windows搭建kafka
    rocketmq-client使用
    Window搭建部署RocketMQ
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181309.html
Copyright © 2020-2023  润新知