题目描述:
实现函数double Power(double base, int exponent),求base 的exponent次方,不得使用库函数,同时不考虑大数问题
我们知道在标准的math 库里面有pow 函数可以来求乘方,本题要实现pow的功能,要求实现特定的功能
解法1 :
躺解的解法:
public static double Pow(double base, int exponent) {
double sum = 1.0;
for (int i = 0; i < exponent; i++) {
sum = sum * base;
}
return sum;
}
但是有问题,因为没有考虑exponent 小于1 即 0 或者负数的情况,第一版代码完全没有考虑,只包括了指数是整数的情况。
解法2 :
我们知道指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再去取倒数,既然会有倒数,就要考虑有没有0出现的可能,如果对0 求导数会怎么办?当底数(base)是0 且指数是负数的时候,如果不做特殊处理,就会对0求倒数而导致程序出bug
public static double Pow2(double base, int exponent) {
flag = false;
if (base == 0 && exponent < 0) {
flag = true;
return 0.0;
} else if (exponent < 0) {
double sum = Pow(base, -exponent);
sum = 1 / sum;
return sum;
} else {
return Pow(base, exponent);
}
}
这里调用了上一个里面的Pow函数,这样比较省事
3 最终版算法
如果我们的目标是一个数字的32 次方,如果我们已经知道了它的16 次方,那么只要在16次方的基础上再平方一次就可以了,而16 次方是8次方的平方,以此类推…
也就是说我们可以用如下公式求a的n 次方:
代码实现:
** public static double Pow3(double base, int exponent) {
if (base == 0 && exponent < 0) {
return 0.0;
} else if (exponent < 0) {
double sum = UnsignedPow(base, -exponent);
sum = 1 / sum;
return sum;
}else {
return UnsignedPow(base, exponent);
}
}
public static double UnsignedPow(double base, int exponent) {
if (exponent == 0)
return 1;
if(exponent==1)
return base;
double result = UnsignedPow(base, exponent>>1);
result *= result;
if((exponent & 0x1) ==1) result *=base;
return result;
}**