剑指offer-11.数值的整数次方

https://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00?tpId=13&tqId=11165&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

题解:

注意点:
1、要考虑输入的指数 exponent 是负数的情况。
且如果输入的指数是负数,且 底数是 0 ,就会出现 1/0 ,导致程序运行出错,所以要做特殊处理。

一般有3种方式将错误信息传递给函数调用者:

  1. 用函数返回值来告知调用者是否出错。缺点:不能方便的使用函数返回结果,要先检查、判断。
  2. 设置一个全局变量,保存是否调用成功。缺点:调用者很容易忘记去检查全局变量。
  3. 异常。优点:可以为不同的出错原因定义不同异常类型,逻辑清晰明了。缺点:有些语言不支持,抛出异常时对性能有负面影响。

2、判断浮点数是否相等,不能直接用==,因为计算机内表示小数(float和double)都有误差。判断两个小数是否相等,只能判断他们之差的绝对值是否在一个很小的范围内。

3、0 的 0 次方在数学上是没有意义的。因此无论输出 0 还是 1 都可以,但最好和面试官说清楚,表明我们考虑了这个边界值了。

public class Solution {
    final double epsilon = 0.0000001;

    public double Power(double base, int exponent) {
        if (Math.abs(base - epsilon) == 0 && exponent < 0) {//0的负数次幂,非法
            throw new RuntimeException("input error");
        }
        int absExponent=Math.abs(exponent);
        double result=1.0;
        for(int i=1;i<=absExponent;i++){
            result*=base;
        }
        if(exponent<0){
            result=1.0/result;
        }
        return result;
    }
}

解法二:

如果输入的指数 为 32,解法一需要 31 次乘法。
换一种思路:求一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方以下就好了,而16次方是8次方的平方,以此类推,我们求32次方只需要 5 次乘法。所以有以下公式求a 的 n 次方:
这里写图片描述

可以用递归实现:

public class Solution {
    final double epsilon = 0.0000001;

    public double Power(double base, int exponent) {
        if (Math.abs(base - epsilon) == 0 && exponent < 0) {// 0的负数次幂,非法
            throw new RuntimeException("input error");
        }
        if (exponent == 0) {
            return 1;
        }
        if (exponent == 1) {
            return base;
        }
        int absExponent = Math.abs(exponent);
        double result = Power(base, absExponent >> 1);
        result *= result;
        if ((absExponent & 1) == 1) {// 等价于 absExponent%2==1
            result *= base;
        }
        if (exponent < 0) {
            result = 1.0 / result;
        }
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/zxm1306192988/article/details/80852616