题目:实现函数double power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 解析:我们可以很快就写出一下的代码。不过遗憾的是,写得快不一定就对,如果输入的指数(exponent)小于1即是零和负数的时候怎么办。下面代码只考虑指数为正数的情况。double power(double base,int exponent) { double res = 1.0; for(int i = 1; i <= exponent; ++i) { res *= base; } return res; }方法一:当我们知道指数为负数的时候,可以先对指数求绝对值,然后算出结果后再取倒数。取倒数的情况,我们需要特殊考虑对0取倒数。最后,由于0的0次方在数学上是没有意义的,因此输出0还是1都是可以接受的。//判断两个double类型的数值是否相等 bool equal(double num1,double num2) { if((num1 - num2) < 0.0000001 && (num1 - num2) > -0.0000001) { return true; } return false; } //对指数为正数的情况求值 double powerWithUnsigned(double base,unsigned int exponend) { double res = 1.0; for(unsigned int i = 1; i <= exponend; ++i) { res *= base; } return res; } //全面考虑的情况 double power(double base,int exponend) { //对0求倒数情况,我们抛出异常 if(equal(base,0.0) && exponend < 0) { throw new exception("参数异常"); return 0.0; } unsigned int absExponend = (unsigned int)exponend; if(exponend < 0) { absExponend = (unsigned int)(-exponend); } if(exponend < 0) return 1.0 / powerWithUnsigned(base,absExponend); return powerWithUnsigned(base,absExponend); }方法二:全面高效的解法,如果输入的指数exponent为32,我们在powerWithUnsigned的循环中需要做31次乘法,但我们可以换一种思路考虑,我们的目标是求出一个数的32次方,我们可以先求出它的16次方,只需要在16次方的基础上再次平方一次就可以了。所以我们用递归的方式改写powerWithUnsigned函数。double powerWithUnsigned01(double base,unsigned int exponend) { if(exponend == 0) return 1.0; if(exponend == 1) return base; double res = powerWithUnsigned01(base,exponend>>1); res *= res; if(exponend & 1) { res *= base; } return res; }