50. Pow(x, n)
Description:
implement pow(x, n).
Solution:
一、题意理解
题意很简单,就是自己实现一个幂函数pow(x,n),即计算x的n次方。这里x是浮点型,n是整型。
二、分析
1、幂次是整型的情况下,可以分为两种情况,一种n是负数,一种n是非负数。而负数的情况下,仅仅是正数幂次结果的倒数,所以归根结底还是计算x的正整数幂次方。(n=0通过循环控制也可以包含在内)
2、传统的计算x的n次方就是一个for 0 to n循环,进行n次乘法,计算最后的和,但这肯定不是我们想要的结果。
3、我们可以想一下,能不能跳跃乘法,也就是做少于n次的乘法。考虑到n是一个整数,可以使用位操作来取,例如n=9,二进制为1001,那么x^9 = (x^8)*(x^0)*(x^0)*(x^1),所以令结果ans = 1,右往左看,当bit = 1时,即令结果ans *= x,0当bit = 0时,即令x *= x,依次类推,就可以在Log(n)的时间内得到结果。当然这里一些变量要用long long类型以防止溢出。
4、代码如下:
class Solution {
public:
double myPow(double x, int n) {
double ans = 1;
unsigned long long p;
if( n < 0)
{
p = -n;
x = 1 / x;
}
else
p = n;
while(p)
{
if( p & 1)
ans *= x;
x *= x;
p >>= 1;
}
return ans;
}
};