数值的整数次方

题目:实现函数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次方。

 

posted on 2016-04-30 12:14  wxdjss  阅读(278)  评论(0编辑  收藏  举报

导航