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

上代码:

方法一:常规递归,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. jquery.dragsort实现列表拖曳、排序

    在一次工作中需要将功能模块实现拖曳并且排序,并且将排序结果保存到数据库,用户下次登录后直接读取数据库排序信息进行显示.LZ找了好多插件,最后发现 jquery.dragsort 这款插件是最好使用的, ...

  2. 团体程序设计天梯赛-练习集L1-004. 计算摄氏温度

    L1-004. 计算摄氏温度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈建海 给定一个华氏温度F,本题要求编写程序,计算对应的 ...

  3. sublime 配置

    Sublime Text 2是那种让人会一眼就爱上的编辑器,不仅GUI让人眼前一亮,功能更是没的说,拓展性目前来说也完全够用了,网上介绍软件的文章和推荐插件的文章也不少,而且很不错,大家可以去找找自己 ...

  4. 微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同。

    微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同. .NET Collection 函数库的 Has ...

  5. nginx面试题

    1.Nginx是如何实现高并发的 service nginx start之后,然后输入#ps -ef|grep nginx,会发现Nginx有一个master进程和若干个worker进程,这些work ...

  6. 远程唤醒 N54L

    远程唤醒 N54L 我的N54L装了一块买时带的WD500G黑盘,又装了一个WD2T绿盘,存些电影歌曲什么的,当NAS用,装的WIN7系统,长时间不使用就自动关机了,每次都得按一下电源开关键,于是就研 ...

  7. python sort()和sorted()方法

    直接上代码: list_a=['a','c','z','E','T','C','b','A','Good','Tack'] list_b=['a','c','z','E','T','C','b','A ...

  8. poj 3274 Gold Balanced Lineup(哈希 )

    题目:http://poj.org/problem?id=3274 #include <iostream> #include<cstdio> #include<cstri ...

  9. 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万个同时请求

    具体设置如下: 1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为65535. IIS Manager > ApplicationPools > Advanced Setti ...

  10. UVa 1210 (高效算法设计) Sum of Consecutive Prime Numbers

    题意: 给出n,求把n写成若干个连续素数之和的方案数. 分析: 这道题非常类似大白书P48的例21,上面详细讲了如何从一个O(n3)的算法优化到O(n2)再到O(nlogn),最后到O(n)的神一般的 ...