《剑指offer11——数值的整数次方》
2018-03-30 01:09
316 查看
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解法1:
解法2:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解法1:
/** * 给定一个double类型的浮点数base和int类型的整数exponent。求base * 的exponent次方 * @param args */ public static double Power(double base,int exponent){ double solution = 1.0; if(exponent >= 0){ while(exponent !=0){ solution *= base; exponent--; } return solution; } else{ exponent = -exponent; if(equal(base,0.0)){ //double类型判断相等时不能用“==” throw new RuntimeException("0不能出现负次幂!"); } while(exponent !=0){ solution *= base; exponent--; } return 1/solution; } } public static boolean equal(double num1,double num2){ if((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)){ return true; } else return false; }
解法2:
/** * 二分快速幂解法 * 1.全面考察指数的正负、底数是否为零等情况。 * 2.写出指数的二进制表达,例如13表达为二进制1101。 * 3.举例:10^1101 = 10^0001*10^0100*10^1000。 * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。 */ public static double Power2(double base, int n){ double res = 1,curr = base; int exponent; if(n>0){ exponent = n; }else if(n<0){ if(base==0) throw new RuntimeException("分母不能为0"); exponent = -n; }else{// n==0 return 1;// 0的0次方 } while(exponent!=0){ if((exponent&1)==1) //该二进制位为1,则结果res乘以curr当前值 res*=curr; exponent>>=1;// 右移一位 curr*=curr;// 右移1位则,底数base翻倍,即curr^2 } return n>=0?res:(1/res); }
相关文章推荐
- 剑指Offer11:数值的整数次方
- 剑指Offer11数值的整数次方
- 剑指offer11:数值的整数次方
- 数值的整数次方
- 剑指offer(12):数值的整数次方
- 数值的整数次方
- 算法(位运算)--- 数值的整数次方
- 数值的整数次方――11
- 牛客网剑指offer-数值的整数次方
- 数值的整数次方
- 剑指Offer 11 数值的整数次方
- 剑指Offer(12)______数值的整数次方
- 《剑指offer》面试题11:数值的整数次方
- 面试题11 数值的整数次方
- 数值的整数次方(剑指offer面试题11)
- C++剑指offer_面试题11_数值的整数次方(*)
- 数值的整数次方代码实现
- 数值的整数次方
- 面试题11:数值的整数次方
- 剑指offer-数值的整数次方