面试题16:数值的整数次方
题目:
实现函数power(double base, int exponent),求base的exponent次方。不能使用库函数,同时不需要考虑大数问题
需要考虑的问题:
次方为正、负、0;输入为0
次方为正时,直接计算;次方为负时,先计算正的次方数,再求倒数;如果输入为0,次方为负——异常处理
先考虑base,再考虑exponent
public class Q16 {
public static void main(String[] args) {
System.out.println(Power(0,0));
System.out.println(Power(0,-1));
System.out.println(Power(0,2));
System.out.println(Power(2,5));
System.out.println(Power(2,-5));
System.out.println(Power(2,0));
}
public static double Power(double base,int exponent) {
double result = 0;
// base = 0 且为求负的次方 错误返回
if(base == 0 && exponent<0) { return -1; }
// base = 0 且为求正次方
if(base == 0 ) { return 0; }
// 0次方返回1
if(exponent == 0) { return 1; }
// 1次方返回原数
if(exponent == 1) { return base; }
if(exponent>0) {
result = unsignPow(base,exponent);
}else {
result = unsignPow(base,-1*exponent);
result = 1/result;
}
return result;
}
// base!=0
public static double unsignPow(double base,int exponent) {
// 奇数 偶数
//System.out.printf("base:%f,exponent:%d\n",base,exponent);
if(exponent == 0) {return 1;}
if(exponent == 1) {return base;}
double result = unsignPow(base,exponent>>1);
// 偶数,则自己乘自己 如2^8 = 2^4 * 2^4
result = result * result;
// 奇数,则需要乘base 如 2^7 = 2^3 * 2^3 * 2
if((exponent & 0x1) ==1) {
result = result * base;
}
return result;
}
}