剑指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;
        }
    }

原文地址:https://www.cnblogs.com/JefferyChenXiao/p/12246313.html

时间: 2024-11-10 11:40:26

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

[剑指offer]Q11:数值的整数次方

pow(base, exponent) 考虑一下几种情况: base = 0, 那么直接返回0 base = 1, 那么直接返回1 exponent = 0, 那么直接返回1, 注意base= 0 exponent = 1, 那么直接返回 base exponent  为正为负 的情况 主要考察的点是将问题缩减,用折半的思想.这个题细节还是很多的,为了便于验证,leetcode上恰好有这个题,建议在线AC一下. def equal(self, a, b): return abs(a - b) <

剑指offer 13:数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 问题分析 计算一个浮点数的整数次方,主要考察的是对输入数据的完整性的预估能力.针对此问题,输入数据可能存在以下情况: 1.底数不为0,指数都为整数 2.底数不为0,指数都为负数 3.底数为0,指数为负数(出现零除情况) 4.底数为0,指数为正数(给定特殊值0或1) 代码实现的逻辑并不复杂,主要是需要考虑到所有可能存在的输入情况,同时需

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

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. public class Solution { public double Power(double base, int exponent) { boolean isNegtive = false; if(exponent == 0) return 1; if(exponent == 1) return base; if(exponent < 0){ isNegtive =

【剑指offer】15_数值的整数次方

题目 给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方 保证base和exponent不同时为0. 1.用内置函数pow 语法: class Solution: def Power(self, base, exponent): # write code here if base == 0: return 0 elif exponent == 0: return 1 elif base == 1: return 1 elif expone

剑指Offer对答如流系列 - 不用加减乘除做加法

面试题65:不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 问题分析 我们之前详细探讨了位运算 剑指Offer对答如流系列 - 二进制中 1 的个数,已经非常非常详细了. 这道题仅仅是让做加法,我们除此之外还是做了乘除与减法. 记不清的朋友可以回头看看. 这里象征性地做一次解答吧 问题解答 public int add(int num1,int num2) { while(num2!=0){ int sum=num1^num2; in

剑指Offer对答如流系列 - 礼物的最大价值

面试题47:礼物的最大价值 题目描述 在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格直到到达棋盘的右下角.给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物? 比如下面的棋盘中,如果按照红色数字的路线走可以拿到最大价值为53的礼物 问题分析 动态规划:定义f(i,j)为到达(i,j)位置格子时能拿到的礼物总和的最大值,则有:f(i,j)=max{f(i-1,j),f(i,j-1)}+va

剑指Offer对答如流系列 - 序列化二叉树

面试题37:序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 树的结构定义如下: public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,具体的内容我们之前探讨过 剑指Offer对答如流系列 - 重建二叉树 但是采用这种方式进行序列化

剑指Offer对答如流系列 - 把数组排成最小的数

面试题45:把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323. 问题分析 之前我们做过字符全排列的习题 剑指Offer对答如流系列 - 字符串的排列,但是将算法思想应用到这一题的话,效果不好,求出所有的组合,再计算出组合的最小值,这效率该多低啊. 我们还要进一步探究,看看有没有不错的规律,供我们使用. 因为数字拼接后的长度一样,拼接后的结果

剑指Offer对答如流系列 - 从上往下打印二叉树

面试题32:从上往下打印二叉树 题目描述 树的结构定义如下: public class Node{ int e; Node left; Node right; Node(int x) { e = x; } } (一)不分行从上到下打印二叉树 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印. 比如下面二叉树,输出顺序为 8 6 10 5 7 9 11 (二)分行从上到下打印二叉树 从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行. 比如下面二叉树,输出