這道題目有以下幾點需要注意:
根據以上4個注意點,我們可以寫出求指數的程序,代碼如下:
1 #include<iostream>
2 #include<stdlib.h>
3 using namespace std;
4
5 //全局變量,測試時檢查它,用於判斷輸入正確與否
6 bool g_InvalidInput = false;
7
8 //由於精度原因,double類型的變量不能用等號判斷兩個數是否相等,因此需要寫equsl函數
9 bool equal(double num1, double num2)
10 {
11 if((num1 - num2)>-0.0000001 && (num1 - num2) < 0.0000001)
12 return true;
13 else
14 return false;
15 }
16
17 //方法1采用循環
18 double PowerWithUnsignedExponent(double base, unsigned int exponent)
19 {
20 double result = 1.0;
21 for(int i = 1; i<=exponent; ++i)
22 result *= base;
23
24 return result;
25 }
26
27 //方法2 采用遞歸
28 double PowerWithUnsignedExponent1(double base, unsigned int exponent)
29 {
30 if(exponent == 0)
31 return 1;
32 if(exponent == 1)
33 return base;
34
35 //位運算代替除以2,位運算的效率比乘除法及求余運算的效率要高很多
36 double result = PowerWithUnsignedExponent1(base, exponent >> 1);
37 result *= result;
38
39 if(exponent & 0x1 == 1) //位與,代替求余%來判斷一個數是奇數還是偶數
40 result *= base;
41
42 return result ;
43 }
44
45 double Power(double base, int exponent)
46 {
47 g_InvalidInput = false;
48
49 //如果底數為0且指數小於0,則表明是非法輸入。
50 if(equal(base, 0.0) && exponent < 0)
51 {
52 g_InvalidInput = true; //此時全局變量變為true
53 cout<<"invalid input"<<ends;
54 return 0.0;
55 }
56
57 //判斷指數正負,取指數的絕對值
58 unsigned int absExponent = (unsigned int)exponent;
59 if(exponent < 0)
60 absExponent = (unsigned int)(- exponent);
61
62 //此處選擇使用方法2,使用方法1的話改下代碼就可以了。
63 double result = PowerWithUnsignedExponent1(base, absExponent);
64
65 //如果指數小於0則取倒數
66 if(exponent < 0)
67 result = 1.0 / result;
68
69 return result;
70 }
71 int main()
72 {
73 double num1=Power(2.0,-2); //0.25
74 double num2=Power(2.0, 2); //4
75 double num3=Power(0.0, 2); //0
76 double num4=Power(0.0, 0); //無意義,這裡選擇輸出1
77
78 cout<<num1<<endl;
79 cout<<num2<<endl;
80 cout<<num3<<endl;
81 cout<<num4<<endl;
82
83 cout<<endl;
84
85 //無效輸入 返回0
86 double num5=Power(0, -2);
87 cout<<num5<<endl;
88
89 return 0 ;
90 }
