题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需考虑大数问题。
分析:直接想法解答:
double Power(double base.int exponent) { double result=1.0; for(int i=1;i<=exponent;++i) result*=base; retrun result; }
但是,上面的解法是有问题的,如果输入的指数exponent小于1即是零和负数的时候怎么办?上面的代码只考虑了指数为正的情况。当指数为负数的时候可以求其绝对值,然后算出结果后求倒数,那么如果底数为0且指数为负就会出现错误。居于此我们需要采取三种方法:返回值,全局代码和异常。解决方式如下:
boll g_InvalidInput =false; double Power(double base,int exponent) { g_InvalidIput=false; if(equal(base,0.0)&&exponent<0) { g_InvalidInput=true; return 0.0; } unsigned int absExponent=(unsigned int)(exponent); if(expoennt<0) absExponent=(unsigned int)(-exoponent); 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; } bool equal(double num1,double num2) { if((num1-num2>-0.0000001)&&(num1-num2<0.0000001)) return true; else return false; }
这里注意:在判断底数base是不是0时,不能直接的写base==0,这是因为在计算机内部表示小数的时候都有误差。判断两个小数是否相等时,只能判断他们之间的差的绝对值是不是在一个很小的范围内,如果差值很小,我们就认为他们相等,这就是我们定义函数equal的原因。
函数PowerWithUnsignedExponent其实还可以优化,如果指数为32,则要进行31次乘法,其实不用那么多,如果我们知道了这个数的16次方,只要在16次方的基础上平方以下就好,而16次方是8的次方的平方。以此类推求32次方其实只需要做5次乘法。基于此,改进如下:
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; }
本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1582783
原文地址:http://secondscript.blog.51cto.com/9370042/1582783