面试题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; }