算法
(模拟) $O(n)$
由于本题的指数是int
范围,可能很大,所以需要用快速幂求解。
快速幂模板可以参考:AcWing 875. 快速幂。
注意当指数是负数时,我们需要先取指数的绝对值,最后将乘积的倒数作为答案。
时间复杂度
假设指数是 $n$,则一共会循环 $O(logn)$ 次,所以时间复杂度是 $O(logn)$。
C++ 代码
class Solution {
public:
double myPow(double x, int n) {
typedef long long LL;
bool is_minus = n < 0;
double res = 1;
for (LL k = abs(LL(n)); k; k >>= 1) {
if (k & 1) res *= x;
x *= x;
}
if (is_minus) res = 1 / res;
return res;
}
};
js写这题
1.00000001 999999997
这个样例会过不去,输入会变成1,感觉精度被抹掉了,不知道咋办?力扣做就可以,这里就不行
10
2147483648
测试数据会出错。
但是
确可以正常运行。
你的数太大了,double存不下
2147483648已经爆int了
这个for 循环什么意思啊
老师这里是时间复杂度$O(\log n)$吧
return pow(x,n);直接过
牛了,面试直接把库函数甩面试官脸上
这种去面试直接让你走人了doge
力扣指出了不能使用库函数
为什么指数要转换成
long long
类型啊int 的负数比正数多一个数,使用int,负数转正数时,会溢出
-2147483648这是这个题的一个数据,题目中说的是不超过10^9应该是指不超过10^9这个数量级把?
我也遇到了
if (k & 1) res *= x; //为什么奇数要拿出来单独处理
没理解
和奇数无关,而是它每次都是k>>1,判断k的二进制的最后一位是不是1,因为快速幂的思想是要把指数按照二进制进行拆解,然后如果当前位是1,res就需要乘
不是奇数的意思 n^5 = n^4 * n^1 (n^0101 = n^0100 * n^0001)
好的,理解了
所以说 得将 n 转成
long long
后 才取绝对值!两个问题:
①
typedef long long LL;
LL k = abs(LL(exponent)); 可以
而 long long = abs(long long(exponent)); 编译不过
②
为什么要对exponent转为LL再进行abs,不转化为啥会超时
而 long long k = abs(long long(exponent)); 编译不过 【漏写了个k】
long long(exponent)改成(long long)expoent可以过,static_cast[HTML_REMOVED](n)也可以过,可能是结合顺序问题
我把k转换成unsigned也AC了
为啥要k转换成long long
class Solution {
public:
double Power(double base, int exponent) {
double res=1;
for(int i=0;i<abs(exponent);i++) res*=base;
if(exponent<0) res=1/res;
return res;
}
};
为什么 我这样写是错的呀?
要用快速幂不然会超时
为什么
指数最大有$10^9$啊,你如果不用快速幂,一遍一遍地做,就要做$10^9$次,要TLE的
这样为啥过不了,好像精度不行
当exponent等于负无穷时,取相反数会超出int范围。
本题不需要使用
long long
需要的,当n为负无穷时,取绝对值会超出int范围。
我开始一直没明白为啥long long 来着,原来是负无穷啊,受教了,hhh
y总,你这一题应该是没有加负无穷的测试用例,我没用long long,ac通过了
数据已加强,增加了此类数据
请问下 这题如果考虑大数 数值的整数次方可能溢出 还能考虑快速幂吗?
那样就是在考察高精度乘法了hh 要不要跟快速幂结合,就要看出题人给的数据范围了。
万一exponent是小数怎么办
我说的是不是整数次幂的情况
本题数据已加强,题解已更新。现在指数最大是 $10^9$ 级别,需要用快速幂求解。如果指数是小数,就需要用一些数理方法来做了,可以搜一下C++里的库函数是怎么实现的。
a 等于 0.0的情况?这才是剑指Offer里面这个题的考点吧
0.0不用特殊考虑吧。本题需要注意的点在于b可能是负数,需要特判一下。
如果a是0,指数是负数,那最后res = 1/res会得到inf,这个是有意义的么?
0的负数次幂会导致0出现在分母上,在数学上无意义。
好的,谢谢闫神
double
类型,我连乘了半天,结果Time Limit Error
咯,Java
是真的慢……是不是哪写错了。这份Java代码可以AC:AcWing 27. 数值的整数次方。
还以为得用快速幂呢
不需要的hh,这道题目不需要考虑大数问题,只是考察细心程度。