数值的整数次方-剑指Offer
数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
- 主要有几点需要注意
- 由于计算机表示小数(float和double)都有误差,不能直接用等号(==)判断两个小数是否相等。若两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等
- 注意考虑输入值得全面性,正负可能,而且0的负数次幂没意义。
代码
解法一:
public class Solution {
public double Power(double base, int exponent) {
if (equal(base, 0.0) && exponent < 0) {
return 0.0;
}
int absExp = exponent;
if (exponent < 0){
absExp = -exponent;
}
double result = 1.0;
for (int i = 1; i <= absExp; i++) {
result *= base;
}
if (exponent < 0) {
result = 1.0 / result;
}
return result;
}
public boolean equal(double num1, double num2) {
if ((num1 - num2 > -0.0000001) && (num1 - num2) < 0.0000001) {
return true;
} else {
return false;
}
}
}
解法二:
通过递归实现,每次次幂翻倍的乘,可以减少乘法计算的次数,但是注意使用递归前仍然要对输入做必要的检查
public double Power01All(double base, int exponent) {
if (equal(base, 0.0) && exponent < 0) {
return 0.0;
}
int absExp = exponent;
if (exponent < 0) {
absExp = -exponent;
}
double result = Power01(base, absExp);
if (exponent < 0) {
result = 1 / result;
}
return result;
}
public double Power01(double base, int exponent) {
if (exponent == 0) {
return 1;
}
if (exponent == 1) {
return base;
}
double result = Power01(base, exponent >> 1);
result *= result;
if ((exponent & 0x1) == 1) {
result *= base;
}
return result;
}