myPow-链接
如果按照以下的这个代码提交的话还有3个样例过不了(一共304个样例),这里面有个坑….下面我就来说说这个坑
起初一眼看过去,嗯!快速幂,没错,就是的,只是这个题的数据有点卡,题目如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10 输出: 1024.00000 示例 2:
输入: 2.10000, 3 输出: 9.26100 示例 3:
输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 说明:
-100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
|
他这里的n的范围是在:
INT_MIN<=n<=INT_MAX;
而….(真实情况是这样de)
INT_MIN=-2147483648
INT_MAX=2147483647
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public: double myPow(double x, int n) { double ans=1; double base=x; //给定一个标记,m=1代表n>0; int m=1; //1的任何次方都是1; if(x==1) { return x; } //-1的偶数此方是1,奇数次方是-1; if(x==-1) { if(n%2==0) return 1; else return -1; } //如果n==0,则0次方为1; if(n==0) return 1; //如果n是个负数,则答案就要变成1/ans; if(n<0) { m=0; //n<0,标记m=0; n*=-1; //让n变成正数进行计算,但是,这里如果n=INT_MIN,一旦n=n*(-1)的时候,就会造成溢出,因为-INT_MIN在int的情况下是会溢出的....,所以这里就要用到将n转化为long long 的数据类型来存储了 } //好了,到了这里就是一个快速幂的板子了...... while(n) { if(n&1) ans*=base; base*=base; n>>=1; } if(m==0) ans=1/ans; return ans; } };
|
AC的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public: double myPow(double x, int n) { long long f=n; //将n转化为long long 类型,之后只需将n改为f就可以了 double ans=1; double base=x; int m=1; if(x==1) { return 1; } if(x==-1) { if(f%2==0) return 1; else return -1; } if(f==0) return 1; if(f<0) { m=0; f*=-1; } while(f) { if(f&1) ans*=base; base*=base; f>>=1; } if(m==0) ans=1/ans; return ans; } };
|
这道题我觉得就是考察细节问题……在看2019年ICPC直播的时候听杜老师说了一句:多刷题,刷好题,刷难题。
相信总有一天你会成功de,😄嘻嘻