【Offer】[16] 【数值的整数次方】
题目描述
  实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
  
思路分析
- 要考虑到指数为负数的情况,而且指数为负数的时 base不能为0,因为指数为负数时,是指数的绝对值次幂的倒数,(分母不能为0),考虑到这些情况之后,就可以转化为求exponent的绝对值 次幂的问题,即指数为正数的情况
- 现在考虑如何求数值的整数次幂(指数为正数的情况): - 一种方法是直接求,循环exponent次 求得exponent个base的乘积,
- 第二种巧妙的方法,可以利用斐波那契数列的思想,这里利用递归方法, - 当指数为偶数时:可以表示成 两个 base的ex/2次幂 的乘积
- 奇数时:可以表示成 两个 base的ex/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】[16] 【数值的整数次方】的更多相关文章
- 剑指 Offer 16. 数值的整数次方
		实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 来源:力扣(LeetCode) 链接 ... 
- 【剑指offer】面试题 16. 数值的整数次方
		面试题 16. 数值的整数次方 题目描述 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解答过程 下面的讨论中 x 代表 bas ... 
- 《剑指offer》 数值的整数次方
		本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ... 
- 【剑指Offer】数值的整数次方 解题报告(Python)
		[剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ... 
- 【Java】 剑指offer(15) 数值的整数次方
		本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 实现函数double Power(double base, int ... 
- (3)剑指Offer之数值的整数次方和调整数组元素顺序
		一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ... 
- 《剑指offer》面试题16. 数值的整数次方
		问题描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入: 2.0 ... 
- 【剑指offer】数值的整数次方
		版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/25506085 转载请注明出处:http:// ... 
- Go语言实现:【剑指offer】数值的整数次方
		该题目来源于牛客网<剑指offer>专题. 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不 ... 
- 剑指OFFER之数值的整数次方(九度OJ1514)
		题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表 ... 
随机推荐
- Layui多文件上传进度条
			Layui原生upload模块不支持文件上传进度条显示,百度,谷歌找了一下不太适用.后面找到一个别人修改好的JS,替换上去,修改一下页面显示即可使用,一下是部分代码 HTML: <div cla ... 
- 全世界仅有的唯一最高LINUX版本的白菜路由,支持NAND记
			在上上篇 真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记 里,有没有还记否之模式退一步,海阔天空 回到了远古时代的ar7 ... 
- Spring Boot Security Oauth2之客户端模式及密码模式实现
			Spring Boot Security Oauth2之客户端模式及密码模式实现 示例主要内容 1.多认证模式(密码模式.客户端模式) 2.token存到redis支持 3.资源保护 4.密码模式用户 ... 
- windows--OSError: [Errno 22] Invalid argument: '\u202aE:/desk/Desktop/test.txt'  读取文件的坑
			准备打开文件时,报了如下错误: 在路径中出现了这个Unicode 202a字符,导致了这个错误. 这玩意是哪里来的? 复制windows文件属性的时候复制下图中的路径而来的. 解释: 这个字符的含义是 ... 
- 【redis】redis应用场景,缓存的各种问题
			如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 缓存 redis还有另外一个重要的应用领域——缓存 引用来自网友的图解释缓存在架构中的位置 默认情况下 ... 
- linux下python中文乱码解决方案
			1. 场景描述 linux服务器下安装了Anaconda3,执行Pyhton的K-means算法,结果出现如下图的中文字符乱码.上次已经解决了,忘记记录解决流程了,这次配置了一台新的服务器,又出现,默 ... 
- DFS树求割点问题
			时间复杂度:O(n玄学)总之不大 代码实现(好麻烦,蓝题变紫题) #include<iostream> #include<string.h> #include<algor ... 
- 如何美观地打印 Python 对象?这个标准库可以简单实现
			前不久,我写了一篇文章回顾 Python 中 print 的发展历史 ,提到了两条发展线索: 明线:早期的 print 语句带有 C 和 Shell 的影子,是个应用程序级的 statement,在最 ... 
- java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?
			这是java高并发系列第31篇. 环境:jdk1.8. java高并发系列已经学了不少东西了,本篇文章,我们用前面学的知识来实现一个需求: 在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有 ... 
- Mysql主从复制原理及搭建
			## Mysql主从复制原理 主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中.对于多级复制,数据库服务器即可充当主机,也可充当从 ... 
