這道題目有以下幾點需要注意:
根據以上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 }