力扣 题目50--Pow(x, n)
题目
题解
这题应该学过算法的人都熟悉不过了吧
其实只要对半分即可
即n=10;->n=5*5;->n=2*2*1*2*2*1;
也就是说无论n为多少总能变成2和1相乘的形式 那么n=1和n=2就是最基本的形式
要算10就要算5 算5就要算2*2*1 所以我们可以看到需要拿到里面的数才能算出外面的数 用递归再合适不过了
那么正数和0(随便判断一下)就搞定了
减法 我们可以让x=1/x n=-n;即变为正数去运行的代码
但是有个特例int的最小值要和最大值差1 也就是说当n为int最小值时 我们应该让n为int最大值 差的1应该在最后返回时补上
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 //递归 5 double myPowBack(double x, int n) { 6 //当n为1时 7 if (n == 1) 8 { 9 return x; 10 } 11 //当n为2时 12 else if (n == 2) { 13 return x * x; 14 } 15 //当n为偶数时 16 else if (n % 2 == 0) 17 { 18 double num = myPowBack(x, n / 2); 19 return num * num; 20 } 21 //当n为奇数时 22 else 23 { 24 double num = myPowBack(x, (n / 2)); 25 return num * num * x; 26 } 27 //这里随便返回 因为运行不到 28 return x; 29 } 30 //大于等于0 31 double myPowGreaterZero(double x, int n) { 32 //n=0 返回1 33 if (n == 0) { 34 return 1; 35 } 36 double result = myPowBack(x, n); 37 return result; 38 } 39 40 //小于0 41 double myPowLessZero(double x, int n) { 42 bool Min = false; 43 //判断是否为最小 44 if (n == INT_MIN) { 45 //是最小 n = INT_MAX; 因为INT_MAX和INT_MIN只差1 我们在最后返回的结果补上即可 46 n = INT_MAX; 47 x = 1 / x; 48 Min = true; 49 } 50 //不是直接n = -n; 51 else 52 { 53 n = -n; 54 x = 1 / x; 55 } 56 double result = myPowBack(x, n); 57 //如果是最小 在最后返回的结果补上一个x即可 58 if (Min) { 59 result *= x; 60 } 61 return result; 62 } 63 64 class Solution { 65 public: 66 double myPow(double x, int n) { 67 //三则运算符 68 return n >= 0 ? myPowGreaterZero(x, n) : myPowLessZero(x, n); 69 } 70 }; 71 int main() { 72 Solution sol; 73 double x = 2.00000; 74 int n = 10; 75 double result = sol.myPow(x, n); 76 cout << result << endl; 77 }