力扣 题目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 }
View Code

 

posted @ 2022-05-13 14:10  无聊的阿库娅  阅读(28)  评论(0编辑  收藏  举报