当前位置: 首页 > news >正文

java 10的 6次方_【Java】 剑指offer(15) 数值的整数次方

本文参考自《剑指offer》一书,代码采用Java语言。

题目

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

思路

这道题很容易实现,但需要注意以下陷阱:1)0的负数次方不存在;2)0的0次方没有数学意义;3)要考虑exponent为负数的情况。所以可以对exponent进行分类讨论,在对base是否为0进行讨论。

测试用例

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

完整Java代码

(含测试代码)

/**

*

* @Description 面试题16:数值的整数次方

*

* @author yongh

* @date 2018年9月17日 下午5:17:35

*/

// 题目:实现函数double Power(double base, int exponent),求base的exponent

// 次方。不得使用库函数,同时不需要考虑大数问题。

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;

}

// ========测试代码========

void test(String testName, double base, int exponent, double expected, boolean expectedFlag) {

if (testName != null)

System.out.print(testName + ":");

if (power(base, exponent) == expected && IsInvalid == expectedFlag) {

System.out.println("passed.");

} else {

System.out.println("failed.");

}

}

void test1() {

test("test1", 0, 6, 0, false);

}

void test2() {

test("test2", 0, -6, 0, true);

}

void test3() {

test("test3", 0, 0, 1, false);

}

void test4() {

test("test4", 2, 6, 64, false);

}

void test5() {

test("test5", 2, -3, 0.125, false);

}

void test6() {

test("test6", 5, 0, 1, false);

}

void test7() {

test("test7", -2, 6, 64, false);

}

public static void main(String[] args) {

Power demo = new Power();

demo.test1();

demo.test2();

demo.test3();

demo.test4();

demo.test5();

demo.test6();

demo.test7();

}

}

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

test1:passed.

test2:passed.

test3:passed.

test4:passed.

test5:passed.

test6:passed.

test7:passed.

Power

非递归实现乘方:

上面的powerCore()方法可改写如下:

/**

* 非递归实现乘方

*/

private double powerCore2(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;

}

收获

这道题虽然简单,但很有价值,收获如下:

1.double类型好像是不能直接用等号判断,因为存在误差(这里暂时用==好像没问题,不确定)

2.完全掌握快速做乘方的诀窍:涉及到求解某数的n次方问题时,可以采用递归来完成,即利用以下公式:

27a4c756e18421ce405644cb77d64b0e.png

3.使用右移运算符>>代替除以2,有较高的效率:exponent >> 1

4.使用位与运算符代替求余运算符%判断奇偶数,有较高的效率:if ((exponent & 0x1) == 1)

(第三第四条以后在除以2时和判断奇偶时一定要下意识就能想到)

5.不要忽略底数为0而指数为负的情况。

6.非递归实现乘方,其本质是根据指数与2的倍数关系来对底数进行操作。

7.if ((exponent & 0x1) == 1)里面的小括号一定不能忘记!

相关文章:

  • java 方法 返回值 int_关于java字节流类的read()方法返回值为int的思考
  • java 迭代器复制_java设计模式之迭代器模式
  • java取文件类型_java如何通过文件描述符获取文件类型
  • java pdb_当12C PDB遇上JDBC
  • java复选框添加选中事件_Java的JTable中添加JCheckBox,点击事件处理问题,求高手指点迷津...
  • java thread类是抽象类_抽象类详解
  • 摘要认证 java_摘要认证及实现HTTP digest authentication
  • ssdp java_SSDP 简单服务发现协议
  • suse tomcat mysql_suse 安装jdk和tomcat工作记录
  • javascript java 语法_JavaScript
  • java.lang.nullpointerexception:group_为什么会出现java.lang.nullpointerexception错误
  • java数组查找指定元素_Java在数组中查找指定元素的方法
  • k8s mysql volume_k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)
  • java 能够完成多个http请求并回应_Java Web请求与响应实例详解
  • mysql 交叉查询_MySQL连接查询,内连接,外连接,全连接,交叉连接
  • 【翻译】babel对TC39装饰器草案的实现
  • 30天自制操作系统-2
  • AngularJS指令开发(1)——参数详解
  • JS题目及答案整理
  • js写一个简单的选项卡
  • PHP那些事儿
  • 程序员该如何有效的找工作?
  • 解决iview多表头动态更改列元素发生的错误
  • 开源地图数据可视化库——mapnik
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端自动化解决方案
  • 如何在GitHub上创建个人博客
  • 我的zsh配置, 2019最新方案
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个JAVA程序员成长之路分享
  • 【干货分享】dos命令大全
  • kubernetes资源对象--ingress
  • PostgreSQL之连接数修改
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​香农与信息论三大定律
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (Python) SOAP Web Service (HTTP POST)
  • (层次遍历)104. 二叉树的最大深度
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • .gitignore文件---让git自动忽略指定文件
  • .Net 代码性能 - (1)
  • .net 简单实现MD5
  • .net6Api后台+uniapp导出Excel
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net和jar包windows服务部署
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET框架