题目描述

  实现函数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

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

  1. 剑指 Offer 16. 数值的整数次方

    实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 来源:力扣(LeetCode) 链接 ...

  2. 【剑指offer】面试题 16. 数值的整数次方

    面试题 16. 数值的整数次方 题目描述 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解答过程 下面的讨论中 x 代表 bas ...

  3. 《剑指offer》 数值的整数次方

    本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...

  4. 【剑指Offer】数值的整数次方 解题报告(Python)

    [剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  5. 【Java】 剑指offer(15) 数值的整数次方

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 实现函数double Power(double base, int ...

  6. (3)剑指Offer之数值的整数次方和调整数组元素顺序

    一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ...

  7. 《剑指offer》面试题16. 数值的整数次方

    问题描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入: 2.0 ...

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

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/25506085 转载请注明出处:http:// ...

  9. Go语言实现:【剑指offer】数值的整数次方

    该题目来源于牛客网<剑指offer>专题. 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不 ...

  10. 剑指OFFER之数值的整数次方(九度OJ1514)

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表 ...

随机推荐

  1. Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

    一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求 ...

  2. Linux下,为应用程序添加桌面图标(ubuntu18.4)

    一.桌面图标位置 Lniux下桌面图标储存路径为:/usr/share/applications 二.桌面图标格式 所有桌面图标格式均为desktop,即名为XXX.desktop 三.编辑内容(常用 ...

  3. 什么是Singleton?

    Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一. 单:指唯一 例:指实例 单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式. 要点: ...

  4. 【CodeForces - 1200A】Hotelier(水题、模拟)

    Hotelier 直接翻译了 Descriptions Amugae的酒店由10人组成10客房.房间从0开始编号0到99 从左到右. 酒店有两个入口 - 一个来自左端,另一个来自右端.当顾客通过左入口 ...

  5. JavaWeb零基础入门-01 基础概念说明

    一.序言 从学校出来到实习,发现学校学的东西太过基础,难于直接运用于工作中.而且工作中,现在都以web开发为主,学校开了web开发相关课程.自己学的不够深入,所以本人自学JavaWeb开发,介于学习巩 ...

  6. 『深度应用』一小时教你上手MaskRCNN·Keras开源实战(Windows&Linux)

    0. 前言介绍 开源地址:https://github.com/matterport/Mask_RCNN 个人主页:http://www.yansongsong.cn/ MaskRCNN是何凯明基于以 ...

  7. (二十三)c#Winform自定义控件-等待窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  8. canvas 鼠标位置缩放图形

    最近再做 webcad , 需要在 canvas  上对图形进行缩放,主要分为以下几个步骤: 1.找到当前光标所在位置,确定其在相对 canvas 坐标系的坐标 绑定鼠标滚轮事件,假定每次缩放比例 0 ...

  9. cmd命令行界面运行python脚本显示的中文不正确

    在notepad++中编写了一个脚本(如图一),在cmd命令行界面中运行却发现显示的中文不正确(如图2).图3显示的是cmd界面的默认编码. 解决方案:将脚本的注释语言改为GBK,编码格式改为ANSI ...

  10. python方法的使用

    1.函数定义             def  函数名(形参):                     函数体                     return   返回值   2.函数执行   ...