##题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
##解题思路
主要涉及完整性考虑,首先按照正数次幂,负数次幂,0次幂,三种分析,底数为0和非0。
1,第一种方式,常规做法
2,第二种方式,用递归的方法,效率提高
3,第三种方式,用快速幂的方法,可以实现递归的效果
##代码实现
/**
*
*/
package 发散思维;
/**
* <p>
* Title:Power
* </p>
* <p>
* Description:
* </p>
*
* @author 田茂林
* @data 2017年8月25日 上午9:49:35
*/
public class Power {
/**
* void
*
* @param args
*/
public static void main(String[] args) {
System.out.println(DouPowerSuperMax(-2.0, -3));
}
// ==================================================================常规方法
public static double DouPower(double base, int exponent) {
if (base == 0) {
return 0;
}
if (exponent > 0) { // 正数次幂
double result = 1;
for (int i = 1; i <= exponent; i++) {
result *= base;
}
System.out.println(result);
return result;
} else if (exponent < 0) {
double result = 1;
for (int i = 1; i <= -exponent; i++) { // 负数次幂
result *= base;
}
return 1 / result;
} else { // 任何数的0次幂都是1
return 1;
}
}
// ==================================================================递归方式
public static double DouPowerSuper(double base, int exponent) {
if (exponent > 0) {
return helper(base, exponent);
} else {
return 1.0 / helper(base, exponent);
}
}
public static double helper(double base, int exponent) {
if (exponent < 0) {
exponent = -exponent;
}
if (exponent == 0) {
return 1;
}
if (exponent == 1) {
return base;
}
double result = helper(base, exponent >> 1); // 递归方式可以让指数成倍的增长,减少运算次数
result *= result;
if ((exponent & 1) == 1) {
result *= base; // 如果是奇数,要多乘一次
}
return result;
}
// ==================================================================快速幂方式
/**
* 1.全面考察指数的正负、底数是否为零等情况。
* 2.写出指数的二进制表达,例如13表达为二进制1101。
* 3.举例:10^1101 = 10^0001*10^0100*10^1000。
* 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
*/
public static double DouPowerSuperMax(double base, int exponent) {
int flag = exponent;
if (base == 0)
return 0;
if (exponent == 0) {
return 1;
}
if (exponent < 0) {
exponent = -exponent;
}
int res = 1;
while (exponent != 0) {
if ((exponent & 1) != 0) {
res *= base;
}
base *= base;
exponent = exponent >> 1;
}
return flag > 0 ? res : 1.0 / res;
}
}