标签:
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
1 bool g_InvalidInput = false; 2 3 double Power(double base,int exponent) 4 { 5 g_InvalidInput = false; 6 if(equl(base,0,0)&&exponent<0) 7 { 8 g_InvalidInput = true; 9 return 0.0; 10 } 11 unsigned int absExponent =(unsigned int)(exponent); 12 if(exponent<0) 13 absExponent = (unsigned int)(-exponent); 14 double result = PowerWithUnsignedExponent(base,absExponent); 15 if(exponent<0) 16 result = 1.0/result; 17 return result; 18 } 19 20 double PowerWithUnsignedExponent(double base,unsigned int exponent) 21 { 22 double result = 1.0; 23 for(int i=1;i<=exponent;++i) 24 result *= base; 25 return result; 26 } 27 28 bool equal(double num1,double num2) 29 { 30 if((num1-num2>-0.0000001)&&31 (num1-num2<0.0000001)) 32 return true; 33 else 34 return false; 35 } 36 37 更加高效的方法: 38 double PowerWithUnsignedExponent(double base,unsigned int exponent) 39 { 40 if(exponent==0) 41 return 1; 42 if(exponent==1) 43 return base; 44 double result=PowerWithUnsignedExponent(base,exponent>>1); 45 result *=result; 46 if(exponent&0x1==1) 47 result *=base; 48 return result; 49 }
这里的话,假设我们输入的指数exponent为32,我们的目标是求一个数的32次方,如果我们已经知道了它的16次方,那么只需要在16次方的基础上在平方一次就好了。而16次方是8的平方,这样以此类推,我们求32次方只需要做5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。
标签:
原文地址:http://www.cnblogs.com/wxdjss/p/5448515.html