题目:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路:
- 判断底数是否为 0(当两数相差很小时,可以认为相等),指数是否小于 0;
- 取指数的绝对值计算整数次方,若指数为负,通过【1 / 当前结果】得到负的整数次方;
- 计算整数次方,使用递归的方法:
当 n 为偶数时,a ^ n = a ^ (n / 2) * a ^ (n / 2)
当 n 为奇数时,a ^ n = a ^ (n-1 / 2) * a ^ (n-1 / 2) * a
代码:
package 数值的整数次方;
/**
* 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
* @author Administrator
*/
public class Demo {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.Power(2, -5));
}
}
class Solution {
public double Power(double base, int exponent) {
if (equal(base, 0) && exponent < 0) {
return 0.0;
}
int absExponent = exponent;
if (exponent < 0) { // 指数为负数时,取绝对值计算
absExponent = -exponent;
}
double result = PowerWithUnsignedExponent(base, absExponent); // 获取整数次方结果值
if (exponent < 0) { // 若指数为负时,通过【1 / 当前结果】得到负的整数次方
result = 1.0 / result;
}
return result;
}
/**
* 指数非负时的整数次方
* @param base
* @param exponent
*/
public double PowerWithUnsignedExponent (double base, int exponent) {
if (exponent == 0) { // 任何数的 0 次方都为 1,0 的 0 此方返回 1 或 0 都可以。
return 1;
}
if (exponent == 1) {
return base;
}
/**
* 求整数次方,使用递归的方法
* 当 n 为偶数时,a ^ n = a ^ (n / 2) * a ^ (n / 2)
* 当 n 为奇数时,a ^ n = a ^ (n-1 / 2) * a ^ (n-1 / 2) * a
*/
double result = PowerWithUnsignedExponent(base, exponent >> 1); // 递归实现 a^n
result *= result;
if ((exponent & 0x01) == 1) { // 当 n 为奇数时,按位与 0x01 会得到 1
result *= base;
}
return result;
}
/**
* 两数相差很小时,可以认为相等
* @param num1
* @param num2
*/
public boolean equal(double num1, double num2) {
if ((num1 - num2) > -0.0000001 && (num1 - num2) < 0.0000001) {
return true;
} else {
return false;
}
}
}