剑指Offer对答如流系列 - 数值的整数次方

Posted jefferychenxiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer对答如流系列 - 数值的整数次方相关的知识,希望对你有一定的参考价值。

面试题15:数值的整数次方

题目描述

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

问题分析

三思而后行,这道题如果没事实现考虑好,非常容易出错。

首先分析列举出所有的场景。

  1. base的值 可能为正数也可能为负数(包含整数、小数)

  2. exponent的值可能为正整数也可能为负整数

base的值的处理是比较简单的,对于exponent的处理就要多加考虑了。

当exponent的值为负数的时候,可以求其绝对值,算出次方的结果后再取倒数。但是这个时候会有一个特殊条件:base的数值为0,此时必须进行特殊处理,不然对0求倒数肯定出问题。

关于运算的话,就简单多了,进行exponent个base的相乘。对位运算了解少的可以参考我这篇文章盘点那些能绿天绿地绿巨人的位运算操作

问题解答

递推写法

    public class Power {

        boolean IsInvalid = false;//用全局变量标记是否出错

        public double power(double base, int exponent) {
            IsInvalid = false;
            double result; // double类型
            if (exponent > 0) {
                result = powerCore(base, exponent);
            } else if (exponent < 0) {
                if (base == 0) {
                    IsInvalid = true; //0的负数次方不存在
                    return 0;
                }
                result = 1 / powerCore(base, -exponent);
            } else {
                return 1; //这里0的0次方输出为1
            }
            return result;
        }

        private double powerCore(double base, int exponent) {
            double result=1;
            while(exponent!=0) {
                if((exponent&0x1)==1) {
                    result*=base;
                }
                exponent>>=1;
                base*=base;
                //指数右移一位,则底数翻倍
                //举例:10^1101 = 10^0001*10^0100*10^1000
                //即10^1+10^4+10^8
            }
            return result;
        }
    }

涉及到求解某数的n次方问题时,可以采用递归来完成,即利用以下公式:
技术图片

递归写法

    public class Power {

        boolean IsInvalid = false;//用全局变量标记是否出错

        public double power(double base, int exponent) {
            IsInvalid = false;
            double result; // double类型
            if (exponent > 0) {
                result = powerCore(base, exponent);
            } else if (exponent < 0) {
                if (base == 0) {
                    IsInvalid = true; //0的负数次方不存在
                    return 0;
                }
                result = 1 / powerCore(base, -exponent);
            } else {
                return 1; //这里0的0次方输出为1
            }
            return result;
        }

        private double powerCore(double base, int exponent) {
            if (exponent == 1)
                return base;
            if (exponent == 0)
                return 1;
            double result = powerCore(base, exponent >> 1);
            result *= result;
            if ((exponent & 0x1) == 1)
                result *= base;
            return result;
        }
    }

以上是关于剑指Offer对答如流系列 - 数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer》题目:数值的整数次方

剑指Offer对答如流系列 - 从1到n整数中1出现的次数

剑指offer 12.数值的整数次方

剑指offer数值的整数次方

数值的整数次方-剑指Offer

剑指Offer对答如流系列 - 数据流中的中位数