面试题16:数值的整数次方
// 面试题16:数值的整数次方
// 题目:实现函数double Power(double base, int exponent),求base的exponent
// 次方。不得使用库函数,同时不需要考虑大数问题。
解题思路:
解题并不难,重要的是要考虑到输入的各种情况,并且有相应的处理。
double和int都是可以取负数和0的,如果base取0,exponent<0,结果显然是不存在的。
base取0,exponent取非负,直接返回1就可以了。
其他情况,正常运算就好,要注意如果exponent<0,应该取绝对值,完成幂次方之后再取倒数。
如果想提高代码运行效率的话,可以使用递归或者循环来把a^n分解
a^n=a^(n/2)*a^(n/2),n为偶数
a^((n-1)/2)*a^((n-1)/2)*a,n为奇数
还有一点需要注意的就是,float、double类型的变量不能用==来比较,应该另外写个函数。
c/c++:
bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int absExp);
double Power(double base, int exponent) {
//参数校验
if (equal(base, 0.0) && exponent < 0) {
g_InvalidInput = true;
return 0.0;
}
//对指数exponent取绝对值
unsigned int absExp = (unsigned int)(exponent);
if (exponent<0)
absExp = (unsigned int)(-exponent);
//计算pow(base,absExp)
double result = PowerWithUnsignedExponent(base, absExp);
//若exponent<0,取倒数
if (exponent<0)
result = 1.0 / result;
return result;
}
double PowerWithUnsignedExponent(double base, unsigned int absExp) {
//递归中止的边界值
if (absExp == 0)
return 1;
if (absExp == 1)
return base;
//简化计算量
double result = 0;
result = PowerWithUnsignedExponent(base, absExp >> 1);
result *= result;
if (absExp & 0x1 == 1)
result *= base;
return result;
}
bool equal(double num1, double num2){
//double不能直接用==比较
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}

浙公网安备 33010602011771号