leetcode Pow(doubule x,int n)
今天第一天开通博客,心情还是小激动的
上代码:
方法一:常规递归,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)的更多相关文章
- leetcode pow(x,n)实现
题目描述: 自己实现pow(double x, int n)方法 实现思路: 考虑位运算.考虑n的二进制表示形式,以n=51(110011)为例,x^51 = x^1*x^2*x^16*x^32,因此 ...
- LeetCode: pow
Title: https://leetcode.com/problems/powx-n/ 思路:二分.使用递归或者非递归.非递归有点难理解.pow(0,0)=1 递归的方法是将n为负数的用除法解决.有 ...
- Leetcode: Pow(x, n) and Summary: 负数补码总结
Implement pow(x, n). Analysis: Time Complexity: O(LogN) Iterative code: refer to https://discuss.le ...
- [LeetCode] Pow(x, n)
Implement pow(x, n). 有史以来做过最简单的一题,大概用5分钟ac,我采用fast exponential,这个在sicp的第一章就有描述.思想是:如果n是偶数的话,那么m^n = ...
- [LeetCode] Pow(x, n) 二分搜索
Implement pow(x, n). Hide Tags Math Binary Search 题目很简单的. class Solution { public: double pow( ...
- [LeetCode] Pow(x, n) (二分法)
Implement pow(x, n). 刚开始没想到,后来看remlost的博客才写出来,代码很简练: class Solution { public: double pow(double x, i ...
- LeetCode: Pow(x, n) 解题报告
Pow(x, n) Implement pow(x, n). SOLUTION 1: 使用二分法. 1. 负数的情况,使用以下的公式转化为求正数power,另外,考虑到MIN_VALUE可能会造成越界 ...
- [LeetCode] Pow(x, n) 求x的n次方
Implement pow(x, n). 这道题让我们求x的n次方,如果我们只是简单的用个for循环让x乘以自己n次的话,未免也把LeetCode上的想的太简单了,一句话形容图样图森破啊.OJ因超时无 ...
- LeetCode 7 Reverse Integer int:2147483647-2147483648 难度:2
https://leetcode.com/problems/reverse-integer/ class Solution { public: int inf = ~0u >> 1; in ...
随机推荐
- 【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)
CODEVS 2673:Special Judge 题目描述 Description 这个月的pku月赛某陈没有参加,因为当时学校在考试[某陈经常逃课,但某陈还没有强大到考试也可以逃掉的程度].何 ...
- "Principles of Reactive Programming" 之<Actors are Distributed> (3)
Cluster 讲课的这哥们接下来讲了下Akka Cluster的使用,但是是通过把一个以前讲过的actor 系统改成使用cluster来介绍的Akka cluster. 这部分代码很多,还是直接看视 ...
- VS2005中SetUnhandledExceptionFilter函数应用
很多软件通过设置自己的异常捕获函数,捕获未处理的异常,生成报告或者日志(例如生成mini-dump文件),达到Release版本下追踪Bug的目的.但是,到了VS2005(即VC8),Microsof ...
- Emoji表情符号兼容方案(适用ios,android,wp等平台)
http://blog.csdn.net/qdkfriend/article/details/7576524 Emoji表情符号兼容方案 一 什么是Emoji emoji就是表情符号:词义来自日语(え ...
- HDU4720+三角形外接圆
/* 几何 求给定三角形的外接圆圆心 方法:求解二元方程组 */ #include<stdio.h> #include<string.h> #include<math.h ...
- [itint5]合并K个有序链表
merge sort,leet code里面曾经做过.但一开始没这么写,遍历来做,效率n*k了,用了merge sort后,变成logn*k. 用了dummy node.同时要注意size为0的情况. ...
- redis其他问题
如何解决redis高并发客户端频繁time out? 现在业务上每天有5亿+的请求,平时redis的操作在2K+每秒左右.到了高峰有3K+,这时候客户端就会频繁的报connect time out的异 ...
- tinyXml在linux下的使用
[下载] 一.下载 xml 软件包:tinyxml_2_6_2.zipTinyxml(轻量级 c++)下载地址:http://sourceforge.net/projects/tinyxml/?sou ...
- Protected Functions 是理解OO的难点和关键
Protected Functions 是理解OO的难点和关键 private和public函数都好理解,这里就不多说了,夹在中间的prortected却有许多精妙之处,说说我的几个疑问和看法:1. ...
- Stop-The-World
Stop-The-World –Java中一种全局暂停的现象 –全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互 –多半由于GC引起 •Dump线程 •死锁检查 •堆Dum ...