题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方
这道题要考虑到指数的正负,0的情况;底数为0的情况;
然后是快速二次幂的解法;
然后是位运算;
public class 数值的整数次方 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Power2(2, -5));
}
/* 常规解法:复杂度为O(n) */
public static double Power1(double base, int exponent) {
if (base == 0) {
return 0;
}
if (base == 0 && exponent < 0) {
return -1;// 底数为0,指数为负是错误的
}
int index = Math.abs(exponent);
double ans = 1;
for (int i = 0; i < index; i++) {
ans *= base;
}
if (exponent > 0) {
return ans;
} else {
return (float) 1 / ans;
}
}
public static double Power2(double base, int exponent) {
if (base == 0) {
return 0;
}
if (base == 0 && exponent < 0) {
return -1;// 底数为0,指数为负是错误的
}
int index = Math.abs(exponent);
double ans = base;
if (index%2==0) {
while (index!=1) {
ans*=ans;
index/=2;
}
}else {
index -= 1;
while (index!=1) {
ans*=ans;
index/=2;
}
ans*=base;
}
if (exponent > 0) {
return ans;
} else {
return (float) 1 / ans;
}
}
/*用右移运算代替除2,用位与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数。
* 位运算的效率比乘除法及求余运算的效率要高很多*/
public static double Power(double base, int exponent) {
if (base == 0) {
return 0;
}
if (base == 0 && exponent < 0) {
return -1;// 底数为0,指数为负是错误的
}
/* 正负指数都用正数处理 */
int index = Math.abs(exponent);
int ans = 1;
while (index != 0) {
if ((index & 1) == 1) {
ans *= base;
}
base *= base;
index >>= 1;
}
if (exponent > 0) {
return ans;
} else {
return (float) 1 / ans;
}
}
}