今天第一天开通博客,心情还是小激动的

上代码:

方法一:常规递归,x的n次方={xn/2*xn/2              //n为偶

xn/2*xn/2 *x          //n为奇数

}

 class Solution {
public:
bool isinvalid=false; //全局标记,标记是否是非法
double pow(double x, int n) {
if(((x-0.0)>-0.0000001&&(x-0.0)<0.0000001)&&n<) //注意,这里是比较x是否为零,网上多数没有该功能,o的负数次方,显然不行
{
isinvalid=true;
return 0.0;
} if(n==) return 1.0; //0 次方为1 if(n<)
{
return 1.0/recuryPow(x,-n);                //为什么这里的INT_MIN就没问题呢,这里没问题,是因为-n后其实还是个负数,传过去个负数
}
else
{
return recuryPow(x,n);
}
}
double recuryPow(double x,int n) //这时当上面传过来是INT_MIN加负号传过来的时候,n还是INT_MIN,因为INT_MAX装不下,n还是负数为INT_MIN
{
if(n==)
{
return 1.0;
}
if(n==) //如果n为负,就不会走n==1,只可能n=-1,但是如果n=-1,后面recuryPow(x,-1)就等于1.0,然后因为-1为奇数,所以也相当于反回了x
{
return x;
}
double a=recuryPow(x,n/);
if(n&1) //为奇数,无所谓正负,也可以n%2求余,负数也可以用该方法判断奇数偶数
{
return a*a*x;
}
else
{
return a*a;
}
}
};

方法二:除了上述方法,这里还提到了一种十分巧妙并且快速的方法,原文描述如下(效率快来很多):

Consider the binary representation of n. For example, if it is "10001011", then x^n = x^(1+2+8+128) = x^1 * x^2 * x^8 * x^128. Thus, we don't want to loop n times to calculate x^n. To speed up, we loop through each bit, if the i-th bit is 1, then we add x^(1 << i) to the result. Since (1 << i) is a power of 2, x^(1<<(i+1)) = square(x^(1<<i)). The loop executes for a maximum of log(n) times.

该方法通过扫描n的二进制表示形式里不同位置上的1,来计算x的幂次

确实很巧妙

为了正确计算x的n次幂,还需要考虑到以下一些情况:

1) x取值为0时,0的正数次幂是1,而负数次幂是没有意义的;判断x是否等于0不能直接用“==”。

2) 对于n取值INT_MIN时,-n并不是INT_MAX,这时需要格外小心。(前面用的)

3) 尽量使用移位运算来代替除法运算,加快算法执行的速度。

代码实现:

 double my_pow(double x, int n)
{
if(n==)
return 1.0;
if(n<)
return 1.0 / pow(x,-n);
double ans = 1.0 ;
for(; n>; x *= x, n>>=)
{
if(n&>)
ans *= x;
}
return ans;
}

我的代码实现

 class Solution {
public:
bool isinvalid=false;
double pow(double x, int n) {
if(((x-0.0)>-0.0000001&&(x-0.0)<0.0000001)&&n<) //x==0 case
{
isinvalid=true;
return 0.0;
} if(n==) return 1.0; //0 ci fang dengyu 1
double result=1.0; //fang hui de ke neng chaoguo double if(n<)
{
if(n==INT_MIN) //这里很有意思,因为最小负数变成正数比最大正整数还大一,所以要单独处理
{
return 1.0/(myPow(x,INT_MAX)*x);
}
else
return 1.0/myPow(x,-n);
}
else
{
return myPow(x,n);
}
}
double myPow(double x,int n) //变成只处理n大于0的情况,如果上面传过来个负数,while那就成死循环了
{
double result=1.0;
while(n)
{
if(n&) //这里是看每一位是否为1,而不是看是奇偶
{
result*=x;
}
n=n>>; //就算改为n/2表示右移,这里n就可以为负,但上面不行
x=x*x;                             //100010  x,x2,x2*x2=x4,x8,x16,x32    
}
return result; }
};

leetcode Pow(doubule x,int n)的更多相关文章

  1. leetcode pow(x,n)实现

    题目描述: 自己实现pow(double x, int n)方法 实现思路: 考虑位运算.考虑n的二进制表示形式,以n=51(110011)为例,x^51 = x^1*x^2*x^16*x^32,因此 ...

  2. LeetCode: pow

    Title: https://leetcode.com/problems/powx-n/ 思路:二分.使用递归或者非递归.非递归有点难理解.pow(0,0)=1 递归的方法是将n为负数的用除法解决.有 ...

  3. Leetcode: Pow(x, n) and Summary: 负数补码总结

    Implement pow(x, n). Analysis:  Time Complexity: O(LogN) Iterative code: refer to https://discuss.le ...

  4. [LeetCode] Pow(x, n)

    Implement pow(x, n). 有史以来做过最简单的一题,大概用5分钟ac,我采用fast exponential,这个在sicp的第一章就有描述.思想是:如果n是偶数的话,那么m^n = ...

  5. [LeetCode] Pow(x, n) 二分搜索

    Implement pow(x, n). Hide Tags Math Binary Search     题目很简单的.   class Solution { public: double pow( ...

  6. [LeetCode] Pow(x, n) (二分法)

    Implement pow(x, n). 刚开始没想到,后来看remlost的博客才写出来,代码很简练: class Solution { public: double pow(double x, i ...

  7. LeetCode: Pow(x, n) 解题报告

    Pow(x, n) Implement pow(x, n). SOLUTION 1: 使用二分法. 1. 负数的情况,使用以下的公式转化为求正数power,另外,考虑到MIN_VALUE可能会造成越界 ...

  8. [LeetCode] Pow(x, n) 求x的n次方

    Implement pow(x, n). 这道题让我们求x的n次方,如果我们只是简单的用个for循环让x乘以自己n次的话,未免也把LeetCode上的想的太简单了,一句话形容图样图森破啊.OJ因超时无 ...

  9. LeetCode 7 Reverse Integer int:2147483647-2147483648 难度:2

    https://leetcode.com/problems/reverse-integer/ class Solution { public: int inf = ~0u >> 1; in ...

随机推荐

  1. spring +hibernate 启动优化【转】

    最近在负责一个大项目,项目组成员包括项目经理大概10个人左右.项目技术用struts+spring+hibernate实现.项目的规模相对来说是比较大的,总共有10大模块,每个大模块又分为有十几个.甚 ...

  2. uva 1377

    比较不错的一个题,关键是理解状态转移 #include<algorithm> #include<cstdio> #include<cstring> #include ...

  3. C++: std::string 与 Unicode 如何结合?

    关键字:std::string Unicode 转自:http://www.vckbase.com/document/viewdoc/?id=1293 一旦知道 TCHAR 和_T 是如何工作的,那么 ...

  4. Ubuntu环境下手动配置Java环境

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  5. hdu 1760 A New Tetris Game 博弈论

    找sg值,可以选择暴力,也可以利用sg值的特点简化. 暴力就跟取石子一样,没什么差别,DFS搞定.把矩阵看成一个字符串,字符串就是一个状态. 其实我们也可以不暴力求sg值,因为只要当前状态能到达一个s ...

  6. linux MySQL安装配置

    执行下面的命令初始化授权表: ./scripts/mysql_install_db --user=mysql

  7. JavaScript 获取客户端计算机硬件及系统信息

    1.浏览器信息 //浏览器信息 function BrowserInfo() { var userLanguage = navigator.userLanguage;     // 用户在自己的操作系 ...

  8. laravel Authentication and Security

    Creating the user modelFirst of all, we need to define the model that is going to be used to represe ...

  9. jqueryrotate 使用 帮助 笔记 学习

      1.想变角度 $("imgID").rotate(45);   2.想变角度时,有运动过程 $("imgID").rotate({animateTo:45} ...

  10. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析[转]

    前面在介绍Android系统的开机画面时提到,Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户 ...