一.题目
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
二.思路
这道题很简单,但是要留意一些细节,比如
- 底数为0,指数不能为负数(不能对0求倒)
- 底数、指数均为0,最后结果是1。
在数学里面0^0是未定式;
但在离散里面0^0=1;
在计算机中,规定了0^0=1;
我们可以用如下的公式求a的n次方(快速幂方法)
三.代码
//case 1 double power(double base,double exponent){ double result = 1.0; for(int i = 1;i <= exponent;++i) result *= base; return result; } //case2 bool g_InvalidInput = fasle; double power(double base,double exponent){ g_InvalidInput = false; if(equal(base,0.0) && exponent < 0){ g_InvalidInput = true; return; } if(exponent < 0) exponent = -exponent; unsigned int absExponent = (unsigned int)(exponent); double result = PowerWithUnsignedExponent(base,absExponent); if(exponent < 0) result = 1.0 / result; return result; } double PowerWithUnsignedExponent(double base,unsigned int exponent){ double result = 1.0; for(int i = 1;i <= exponent;i++) result *= base; return result; } //case3 double PowerWithUnsignedExponent(double base,unsigned int exponent){ if(exponent == 0) return 1; if(exponent == 1) return base; double result = PowerWithUnsignedExponent(base,exponent >> 1); result *= result; if(exponent & 0x1 == 1) result *= base; return result; }
四.本题考点
- 考查应聘者思维的全面性。这个问题本身不难,但能顺利通过的应聘者不是很多。有很多人会忽略底数为0而指数为负数时的错误处理(这里我们采用了全局变量);
- 对效率要求比较高的面试官还会考查应聘者快速做乘方的能力;