【Offer】[16] 【数值的整数次方】

  • 题目描述
  • 思路分析
  • 测试用例
  • Java代码
  • 代码链接

题目描述

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

思路分析

  1. 要考虑到指数为负数的情况,而且指数为负数的时 base不能为0,因为指数为负数时,是指数的绝对值次幂的倒数,(分母不能为0),考虑到这些情况之后,就可以转化为求exponent的绝对值 次幂的问题,即指数为正数的情况
  2. 现在考虑如何求数值的整数次幂(指数为正数的情况):
    • 一种方法是直接求,循环exponent次 求得exponent个base的乘积,
    • 第二种巧妙的方法,可以利用斐波那契数列的思想,这里利用递归方法,
      • 当指数为偶数时:可以表示成 两个 baseex/2 次幂 的乘积
      • 奇数时:可以表示成 两个 baseex/2 次幂 乘积 再乘以base(这里的ex/2是在程序中的运算,5/2 = 2
      • 公式如下:

      ?

测试用例

  指数和底数都分别设置为正数、负数和0.

Java代码

public class Offer16 {

    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }

    public static double powCustom(double base, int exponent) {
        return Solution2(base, exponent);
    }

    /**
     * 解法一, 要考虑到边界值, exponent为负数时,还要比如0的负数次方
     *
     * 其中powCustomCore1 方法是利用 直接求的方法
     *
     * @param base
     * @param exponent
     * @return
     */
    private static double Solution1(double base, int exponent) {
        if (base == 0 && exponent < 0) {
            throw new IllegalArgumentException("0的指数不能为负数");
        }
        int absExponent = exponent;
        if (exponent < 0) {
            absExponent = -exponent;
        }
        double result = powCustomCore1(base, absExponent);
        if (exponent < 0) {
            result = 1.0 / result;
        }
        return result;
    }

    /**
     * 方法一: 直接求,将exponent个 base 相乘
     *
     * @param base     基数
     * @param exponent 指数
     * @return
     */
    private static double powCustomCore1(double base, int exponent) {
        double result = 1.0;
        for (int i = 1; i <= exponent; i++) {
            result *= base;
        }
        return result;
    }

    /**
     * 解法二, 要考虑到边界值, exponent为负数时,还要比如0的负数次方
     *
     * 其中 powCustomCore2 方法是利用 递归的方法
     *
     * @param base
     * @param exponent
     * @return
     */
    private static double Solution2(double base, int exponent) {
        if (base == 0 && exponent < 0) {
            throw new IllegalArgumentException("0的指数不能为负数!");
        }
        int absExponent = exponent;
        if (exponent < 0) {
            absExponent = -exponent;
        }
        double result = powCustomCore2(base, absExponent);
        if (exponent < 0) {
            result = 1.0 / result;
        }
        return result;
    }

    /**
     * 方法二:
     *
     * exponent为偶数时,可以将其简化为 两个base的 ex/2 次幂 相乘 exponent为奇数时,可以将其简化为,两个base的 ex/2 次幂
     * 相乘之后再乘以base
     *
     * @param base     基数
     * @param exponent 指数
     * @return
     */
    private static double powCustomCore2(double base, int exponent) {
        if (exponent == 0) {
            return 0;
        }
        if (exponent == 1) {
            return base;
        }
        double result = powCustomCore2(base, exponent >> 1);
        result *= result;
        if ((exponent & 1) == 1) {
            result *= base;
        }
        return result;
    }

    private static void test1() {
        System.out.println("3,3---->" + powCustom(3, 3));
    }

    private static void test2() {
        System.out.println("3,-3----->" + powCustom(3, -3));
    }

    private static void test3() {
        System.out.println("-3,3------>" + powCustom(-3, 3));
    }
}

代码链接

剑指Offer代码-Java

原文地址:https://www.cnblogs.com/haoworld/p/offer16-shu-zhi-de-zheng-shu-ci-fang.html

时间: 2024-08-30 02:57:54

【Offer】[16] 【数值的整数次方】的相关文章

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

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25506085 剑指offer上的第十一题,九度OJ上测试通过. 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数base和一个整数exponent,两个数中间用一个空格隔开. 输出: 对应每

16. 数值的整数次方

面试题16. 数值的整数次方 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 示例 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

16 数值的整数次方 (第3章 高质量的代码)

题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 不只要通过测试,要更着重代码的优化 测试用例: base与exponent分别取正数.0.负数  共3*3九种情况 解题思路: 1)为base与exponent区分正数.0.负数  全面但是不够高效率的解法 class Solution { public: bool g_InvalidInput = false; double Pow

菜鸟系列 Golang 实战 Leetcode —— 面试题16. 数值的整数次方

实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. ? 示例 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 位

剑指Offer 12. 数值的整数次方 (其他)

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目地址 https://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00?tpId=13&tqId=11165&tPage=1&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-

剑指offer:数值的整数次方

题目描述给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution: def Power(self, base, exponent): # 任何数的0次方都是1 if exponent == 0: return 1 # 0的任何次方(除了0的0次方)都为0 if base == 0: return 0 # 先记录指数符号 sign = exponent > 0 exponent = abs(exponent) re

剑指offer (11) 数值的整数次方

利用create groups for any added folders 这样的方式表示的是将所有的资源都放在资源包得路径下,没有层次的概念利用create folder references for any added folders这样的表示方式是在按照原来文件夹的方式将他们放入到安装包中的.在安装包中有几个这样的文件夹:(这些文件都是位于家路径下的)(1)Documents: 该文件夹用于程序数据文件写入到该目录下,用于存储用户数据以及需要备份的数据.(2)Library:include

牛客网习题剑指offer之数值的整数次方

分析: 要考虑到exponent为0和负数的情况. 如果base是0并且exponent是负数的时候呢?那就发生除0的情况了. AC代码: public class Solution { public double Power(double base, int exponent) { if(exponent == 0) return 1; if(Math.abs(base) <= 0.000000000000001) return 0; boolean reverseFlag = exponen

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

// 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考虑大数问题. 解题思路: 解题并不难,重要的是要考虑到输入的各种情况,并且有相应的处理. double和int都是可以取负数和0的,如果base取0,exponent<0,结果显然是不存在的. base取0,exponent取非负,直接返回1就可以了. 其他情况,正常运算就好,要注意如果expo

[剑指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) <