Implement
pow(x, n)
, which calculatesx
raised to the powern
.
Note:
- -100.0 <
x
< 100.0n
is a 32-bit signed integer, within the range[−231, 231 − 1]
實作 pow(x, n),也就是計算
x
的n
次方。
注意:
- -100.0 <
x
< 100.0n
是三十二位元的有號整數,其範圍在[−231, 231 − 1]
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
Example 3:
Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25
return pow(x, n);
也會過,但這樣就沒有意義了XDSquare and multiply
,簡單來說是將n
的部分藉由自己乘自己來大幅加速。
2^9
我們可以想成2*2*2*2*2*2*2*2*2
= 8
次乘法。2*2=4
,然後將式子改為2*4*4*4*4
= 5
次乘法。4*4=16
,最後變為2*16*16
= 4
次乘法。v = 1
去存結果,並將n
想成是二進制碼(9 = 1001
)1
,v *= x
n
往右位移,並將x *= x
。n = 0
。Square and multiply
了,其實並不難理解。x
為整數的情況下,該演算法還可以加入取餘數的功能,讓整體速度更加提升。
n
可能是負數,此時只需要將n
轉回正數,並將v *= x
改為v /= x
即可。n
是否超出範圍,適時的轉換型態或其他處理。
class Solution {
public:
double myPow(double x, int n) {
double value = 1;
long nn = n;
if(nn < 0)
{
nn *= -1;
while (nn)
{
if (nn & 1)
value /= x;
nn = nn >> 1;
x *= x;
}
}
else
while (nn)
{
if (nn & 1)
value *= x;
nn = nn >> 1;
x *= x;
}
return value;
}
};
LeetCode
C++