本文参考自《剑指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();

}

}

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次方问题时,可以采用递归来完成,即利用以下公式:

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

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

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

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

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

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

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

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

    [LeetCode]剑指 Offer 16. 数值的整数次方 文章目录 [LeetCode]剑指 Offer 16. 数值的整数次方 package offer;public class Soluti ...

  2. 【附可运行代码】剑指 Offer 16. 数值的整数次方

    立志用最少的代码做最高效的表达 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn).不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入:x = 2.00000, n = 10 ...

  3. 剑指Offer #12 数值的整数次方(快速幂)

    题目来源:牛客网-剑指Offer专题 题目地址:数值的整数次方 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和 ...

  4. 【LeetCode笔记】剑指 Offer 16. 数值的整数次方(Java、分治)

    文章目录 题目描述 思路 && 代码 二刷 题目描述 很棒的题目!便于分治思想的理解! 思路 && 代码 分情况是大头- 递归结束的情况: x0x^0x0 = 1 x1 ...

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

    题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 分析:熟悉java中Math的话,直接调用即可,深刻说明在常规编程中熟悉java核 ...

  6. 《剑指Offer》 数值的整数次方

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 直接调用pow函数 代码: class Solution { pub ...

  7. 剑指offer——16.数值的整数次方

    题目: 实现求base的exponent次方 知识点: 判断奇数还是偶数,a&1==1: 某数除以二,a >>= 1; a>0? res=1:res=2,当满足条件时,选前者 ...

  8. [剑指Offer]:数值的整数次方(循环解答,快速幂---递归、循环)

    文章目录 题目描述 解答思路 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 示例: ...

  9. 【leetcode】剑指 Offer 16. 数值的整数次方(shu-zhi-de-zheng-shu-ci-fang-lcof)(快速幂)[中等]

    链接 https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/ 耗时 解题:6 min 题解:6 min 题意 实现 po ...

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

    思路:快速幂模板,主要要注意负数的范围,乘以负一的时候会溢出,所以开一下longlong class Solution { public:double myPow(double x, int n) { ...

最新文章

  1. 成贤学院计算机组成原理,东南大学成贤学院计算机硬件课程设计报告解读.doc...
  2. mysql 5.7配置多线程复制,MySQL5.7复制功能实战,基于事务的复制,多源复制和多线程复制配置...
  3. csv python 逐行读取_从 Excel 到 Python
  4. 【总结】那些只要发送口令就能获取的有三AI大包视频和图文资料,你都存下来了吗...
  5. React DnD简明教程
  6. C++实现二叉搜索树的查找(附完整源码)
  7. 分享我对领域驱动设计(DDD)的学习成果
  8. POJ - 3680 Intervals(最大费用最大流+思维建边)
  9. python polar函数_Python可视化很简单,可是你会吗?python绘制饼图、极线图和气泡图,让我来教教你吧,一文教会!!!...
  10. leetcode LCP 19. 秋叶收藏集(dp)
  11. 漫画丨那些年,我们一起被毁过的“三观”…
  12. 神州数码最佳实践之一:向项目管理要效益
  13. 人大金仓数据库(kingbase7d)操作入门指南
  14. Android 原生插件开发步骤
  15. APM监控--(六)Dapper,大规模分布式系统的跟踪系统
  16. element-ui校验表单只能输入数字
  17. 训练好的vgg报错RuntimeError:mat1 and mat2 shapes cannot be multiplied(512*49 and 25088*4096)
  18. STUN, TURN, ICE介绍
  19. Unity中Destory()、DestoryImmediate()和GameObject==null问题
  20. 七月算法机器学习笔记4 凸优化

热门文章

  1. 2022-2028全球全站仪市场现状及未来发展趋势
  2. 内网穿透工具NatApp使用教程
  3. natapp软件使用
  4. H3C 无线控制器关闭信号认证
  5. 实时消息传输协议(RTMP)详解
  6. 【KnockoutJS】KnockoutJS 绑定列表数据。实现表头合并,列生成,图片上传等功能
  7. hmcl启动器安装游戏版本失败_HMCL 启动器教程 #2 安装游戏版本、模组加载器与高清修复...
  8. 前端关于点击链接下载文件的解决办法
  9. 小程序电子名片免费制作
  10. 【一键新机】免root/不刷机/拒绝Xposed 实现 Android改机,全新技术分析。