# 【LeetCode】 50. Pow(x, n)
## Description
> Implement `pow(x, n)`, which calculates `x` raised to the power `n` $(x^n)$.
> Note:
> * -100.0 < `x` < 100.0
> * `n` is a 32-bit signed integer, within the range `[−231, 231 − 1]`
> 實作 pow(x, n),也就是計算`x`的`n`次方$(x^n)$。
> 注意:
> * -100.0 < `x` < 100.0
> * `n` 是三十二位元的有號整數,其範圍在 `[−231, 231 − 1]`
## Example:
```
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
```
## Solution
* 這題要實作pow()運算,你如果直接`return pow(x, n);`也會過,但這樣就沒有意義了XD
* 我們所使用到的技巧叫做`Square 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`次乘法。
* 那麼,我們要怎麼知道要如何計算才能加速呢?
1. 首先,宣告一個新的數字`v = 1`去存結果,並將`n`想成是二進制碼(`9 = 1001`)
2. 接著判斷最低位元:如果是`1`,`v *= x`
3. 接著將`n`往右位移,並將`x *= x`。
4. 重複2.直至`n = 0`。
* 演算法的部分大致上就這樣,其原理就請自行google `Square and multiply`了,其實並不難理解。
* 如果`x`為整數的情況下,該演算法還可以加入取餘數的功能,讓整體速度更加提升。
* 不過這題用不到也不能用。
---
* 除了上面的演算法之外,這題還要處理幾個問題:
* `n`可能是負數,此時只需要將`n`轉回正數,並將`v *= x`改為`v /= x`即可。
* 然後要注意`n`是否超出範圍,適時的轉換型態或其他處理。
### Code
```C++=1
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;
}
};
```
###### tags: `LeetCode` `C++`