剑指offer16. 数值的整数次方P110
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
const double esp = 1e-6;
bool isValid = false; // power函数返回0时,判断合不合法,true时不合法
double powerWithUnsignedExponent(double base, int exponent) {
// 此输入保证指数非负
if (exponent == 0) return 1;
if (exponent == 1) return base;
// 指数除以2递归
double ans = powerWithUnsignedExponent(base, exponent >> 1);
ans *= ans; // 先在上一步递归里算出来a的(n/2)次方, 再平方
if ((exponent & 1)) { // 如果指数是奇数还要再乘以base (规律见p112)
ans *= base;
}
return ans;
}
double power(double base, int exponent) {
isValid = false; // 这是全局变量,不能省 ,默认合法
if (fabs(base - 0.0) <= esp && exponent < 0) {
isValid = true; // 不合法 的0.0
return 0.0;
}
if (exponent == 0)
return 1.0;
if (base == 0) {
return 0.0; // 合法的0.0
}
//先把指数按正数处理
int temp = exponent < 0 ? -exponent : exponent;
double ans = powerWithUnsignedExponent(base, temp);
// 如果指数是负数,结果取倒数
if (exponent < 0)
ans = 1 / ans;
return ans;
}