【剑指offer】面试题16:数值的整数次方
来源:互联网 发布:淘宝智能版首页尺寸 编辑:程序博客网 时间:2024/06/09 18:13
完整代码地址
完整代码地址
题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
在代码注释里
代码(解法1)
不知道为什么我的第一想法就是拿一个数组来保存值…可是完全没有必要,解法1这个代码浪费了没必要的空间。见解法2。
/** * 题目: * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 * * 思路: * public double Power(double base, int exp) * 即 base ^ exp * 如果exp为偶数,则拆分成(base ^ (exp/2)) * (base ^ (exp/2)) * 如果exp为奇数,则拆分成(base ^ (exp/2)) * (base ^ (exp/2)) * base * * 注意:exp可能为负数,负数时先将 exp 转换成绝对值,求出答案 res,最终答案为 1/res * * @author peige */public class _16_Power { public double Power(double base, int exponent) { if(base == 0) return 0; if(exponent == 0) return 1; boolean positive = exponent > 0; exponent = positive ? exponent : -exponent; double[] power = new double[exponent+1]; power[0] = 1; power[1] = base; if(positive) return Power(base, exponent, power); else return 1 / Power(base, exponent, power); } private double Power(double base, int exponent, double[] power) { if(power[exponent] != 0) return power[exponent]; double tmp = Power(base, exponent/2, power); if(exponent % 2 == 0) power[exponent] = tmp * tmp; else power[exponent] = tmp * tmp * base; return power[exponent]; }}
解法2
/** * 题目: * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 * * 思路: * public double Power(double base, int exp) * 即 base ^ exp * 如果exp为偶数,则拆分成(base ^ (exp/2)) * (base ^ (exp/2)) * 如果exp为奇数,则拆分成(base ^ (exp/2)) * (base ^ (exp/2)) * base * * 注意:exp可能为负数,负数时先将 exp 转换成绝对值,求出答案 res,最终答案为 1/res * * @author peige */public class _16_Power { public double Power(double base, int exponent) { if(base == 0) return 0; if(exponent == 0) return 1; boolean positive = exponent > 0; exponent = positive ? exponent : -exponent; if(positive) return PowerCore(base, exponent); else return 1 / PowerCore(base, exponent); } private double PowerCore(double base, int exponent) { if(exponent == 0) return 1; if(exponent == 1) return base; double tmp = Power(base, exponent / 2); if(exponent % 2 == 0) return tmp * tmp; else return tmp * tmp * base; }}
解法3(优化到极致)
public double Power(double base, int exponent) { if(base == 0) return 0; if(exponent == 0) return 1; boolean positive = exponent > 0; exponent = positive ? exponent : -exponent; if(positive) return PowerCore(base, exponent); else return 1 / PowerCore(base, exponent);}private double PowerCore(double base, int exponent) { if(exponent == 0) return 1; if(exponent == 1) return base; //double tmp = Power(base, exponent / 2); double tmp = Power(base, exponent >> 1); //if(exponent % 2 == 0) if((exponent & 1) == 0) return tmp * tmp; else return tmp * tmp * base;}
测试
public static void main(String[] args) { test1(); test2();}/** * 功能测试 * 1.正数次方 * 2.负数次方 */private static void test1() { _16_Power power = new _16_Power(); double res = power.Power(1.1, 2); MyTest.equal(res, 1.21); res = power.Power(3, 3); MyTest.equal(res, 27); res = power.Power(-2, 3); MyTest.equal(res, -8); res = power.Power(5, -2); MyTest.equal(res, 0.04); res = power.Power(-2, -3); MyTest.equal(res, -0.125);}/** * 边界测试 * 1.base为0 * 2.exponent为0 */private static void test2() { _16_Power power = new _16_Power(); double res = power.Power(0, 5); MyTest.equal(res, 0); res = power.Power(3, 0); MyTest.equal(res, 1);}
阅读全文
0 0
- 剑指offer--面试题16:数值的整数次方
- 【剑指offer】面试题16:数值的整数次方
- 【剑指offer】面试题16:数值的整数次方
- [剑指offer][面试题11]数值的整数次方
- 【剑指offer】面试题11:数值的整数次方
- 剑指offer 面试题11 数值的整数次方
- 剑指Offer:面试题11 数值的整数次方
- 《剑指Offer》面试题11:数值的整数次方
- 【剑指Offer学习】【面试题11 :数值的整数次方】
- 《剑指Offer》面试题:数值的整数次方
- 剑指offer-面试题11:数值的整数次方
- 剑指offer-面试题11.数值的整数次方
- 剑指offer之面试题11:数值的整数次方
- 剑指offer----面试题11:数值的整数次方
- 剑指offer之面试题11数值的整数次方
- 剑指Offer--面试题11 数值的整数次方
- 剑指Offer----面试题11:数值的整数次方
- 剑指offer-面试题11:数值的整数次方
- 用c语言打印100-200之间的素数
- 普通表删除记录很慢
- linux 系统管理命令
- MongoDB 聚合管道(Aggregation Pipeline)
- 高效实用Android Studio (一)
- 【剑指offer】面试题16:数值的整数次方
- [bzoj4196][树链剖分][Noi2015]软件包管理器
- 拓扑排序(C语言 邻接矩阵存储)
- 最长公共子序列与最长公共子串--动态规划
- 复习到了快排,简单练一下笔
- numpy中的tile函数
- Java数组,构造方法,this关键字例题全解--经典问题
- Java案例使用for循环+switch case+if else的猜拳小游戏
- J2EE进阶之servlet 九