数值的整数次方
看似简单的题目,相信刚开始学习编程语言时大家都编写过这题,我们先不考虑大数。
很多人可以马上写出
double Power(double base, int exponent) { double result = 1.0; for(int i =1; i <= exponent ; ++i) result *=base; return result; }
明显这个代码存在很多问题:一,指数exponent为负数,零时怎么办,二,当底数为0,指数为负数时怎么办。
代码的鲁棒性也是需要考虑的重点。
bool g_InvalidInput = false; bool equal(double num1,double num2) { if( ((num1-num2) > -0.000001) && ((num1-num2) < 0.000001) ) return true; else return false; } //更高效的进行运算 double PowerWithUnsignedExponent(double base, 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; } double Power(double base, int exponent) { g_InvalidInput = false; //注意double 类型与0的比较 if( equal(base,0.0) && exponent < 0 ) { g_InvalidInput = true; return 0.0; } unsigned int absExponent = (unsigned int )(exponent); if( exponent < 0 ) absExponent = (unsigned int)(-exponent); double result = PowerWithUnsignedExponent(base,absExponent); if( exponent < 0 ) result = 1.0/result; return result; }
全局变量g_InvalidInput用来表示输入数字是否有效,可以通过检查它来判断。
采用递归的方法来进行指数运算效率更高,但是假如指数很大那么还是采用循环方法比较好。

浙公网安备 33010602011771号