题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
这道题目有以下几点需要注意:
- 0的0次方在数学上是没有意义的,因此无论是输出1还是0都是可以接受的,本题选择输出1
- 0的负数次方相当于0作为除数,也是无意义的,非法输入
- base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数
- 判断double类型的base是否等于0不能使用==号。因为计算机表述小树(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个double类型的数相等。
根据以上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 }