【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,表 ...
随机推荐
- CentOS7使用yum安装ceph rpm包
1. 安装centos7对扩展repo的支持yum install yum-plugin-priorities保证下面的选项是开启的[main]enabled = 1 2. 安装 release.ke ...
- 用html和css写一个头部header和左侧菜单栏menu-bar固定的的页面
这个页面header部分是100%的宽度,60px的高度,左侧是刚好一屏的高度,180的宽度,右侧的部分把剩余的空间占满,刚开始的时候还没怎么接触这样的页面,以为使用js读取浏览的可视化宽高,然后在做 ...
- Cocos经典游戏教程之仿皇室战争
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- java并发编程(一)----线程基础知识
在任何的生产环境中我们都不可逃避并发这个问题,多线程作为并发问题的技术支持让我们不得不去了解.这一块知识就像一个大蛋糕一样等着我们去分享,抱着学习的心态,记录下自己对并发的认识. 1.线程的状态: 线 ...
- 建立第一个G2图表
Step1:引进G2脚本 方法一:引入在线脚本 <script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist ...
- ASP.NET Core on K8S深入学习(4)你必须知道的Service
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个 ...
- Sqlserver 锁表查询代码记录
--方法1WITH CTE_SID ( BSID, SID, sql_handle ) AS ( SELECT blocking_session_id , session_id , sql_handl ...
- springCould:使用Feign 实现声明式服务调用
一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...
- js 设计模式&&query
1. 语法: try{ //需要执行的代码 }catch(e){ //错误处理 e程序遇到错误时的报错信息 } 2.惰性函数: 函数在第一次 ...
- Spring Boot MyBatis 数据库集群访问实现
Spring Boot MyBatis 数据库集群访问实现 本示例主要介绍了Spring Boot程序方式实现数据库集群访问,读库轮询方式实现负载均衡.阅读本示例前,建议你有AOP编程基础.mybat ...