题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
刚开始看见这道题觉得特别简单,然而它有好几个边界条件要考虑
1.在base = 0,exponent < 0的情况下,相当于分母为0,等价于无效输入。
2.要分别考虑exponent > 0,以及exponent < 0的情况。
3.当exponent = 0 ,也要单独说明。
还有一种方法,就是我们先不考虑边界条件,观察式子,发现它可以变换成下面这种形式:
然后只需要说明一下,exponent =0,1的情况就好,然后分为奇数和偶数进行讨论就可以了。
为了提高效率,用右移一位代表除2,用和1的与运算表示奇数和偶数。
下面附上完整代码。
#include<iostream> using namespace std; bool equalZero(double num1, double num2); //方法一,全面考虑各种情况 double Power(double base, int exponent) { double result = 1.0; if (equalZero(base, 0.0) && exponent < 0) //底数为0,指数为负 { cout << "输入无效" << endl; return 0; } if (equalZero(base, 0.0) && exponent == 0) //底数为0,指数为0 return 1; if (exponent == 0) //指数为0 return 1; if (exponent < 0) //指数为负 return Power(1.0 / base, -exponent); else if (exponent > 0) //无特殊边界的正常情况 { for (int i = exponent; i > 0; i--) { result *= base; exponent--; } return result; } } //方法2,采用递归的思想 double Power1(double base, int exponent) { if (exponent == 0) return 1; if (exponent == 1) return base; double result = Power1(base, exponent >> 1); result *= result; if ((exponent & 1) == 1) result = base * result; return result; } bool equalZero(double num1, double num2) { if ((num1 - num2) > -0.0000001 && ((num1 - num2) < -0.0000001)) return true; else return false; } int main() { //方法一,全面考虑各种情况 cout << "2^3 = " << Power(2, -3) << endl; cout << "3^5 : " << Power1(3,5 ) << endl; system("pause"); return 0; }