数值的整数次方
题目:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
思路:
1. 使用Math自带的api
偷鸡,但是达不到题目预想的样子
2. 使用移位相乘
快速幂方法:快速幂
public class Solution {
public double Power(double base, int exponent) {
if (base == 0.0 && exponent < 0) {
throw new IllegalArgumentException("分母不能为0");
}
int absExponent = exponent < 0 ? -exponent : exponent;
double res = 1;
double t = base;
//若base 为0 exponent 不为0,算出来的为 0.0
while (absExponent != 0) {
if ((absExponent & 1) == 1) {
res *= t;
}
t *= t;
absExponent >>= 1;
}
return exponent < 0 ? 1.0 / res : res;
}
}
3.递归的方式
正常我们求24次方,需要24次乘法。但是当我们知道12次方的时候,可以直接对12次方乘以自身得到24,按照这样思路,24 -> 12 -> 6 -> 3 -> 1。只需5次乘法即可。
/**
* 递归的形式求快速幂
* @param base
* @param exponent
* @return
*/
public static double recursivePow(double base, int exponent) {
if(exponent == 0) {
return 1;
}
if(exponent == 1) {
return base;
}
double res = recursivePow(base, exponent >> 1);
//这里可以看递归公式,即可明白
if((exponent & 1) == 1) {
res *= base;
}
return res;
}