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

上代码:

方法一:常规递归,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. 引用外部CSS的link和import方式的分析与比较

    很多网页中的 CSS 链接与引用是这样写的: <style type="text/css" media="screen"> @import url( ...

  2. Django 后台搭建

    # Django settings for gameadmin project. DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( # ('Your Nam ...

  3. highcharts 多数据+切换

    var highchartsOptions = { chart:{ renderTo:'container' }, title:{ text:'指标数据' }, tooltip:{ pointForm ...

  4. 214. Shortest Palindrome

    题目: Given a string S, you are allowed to convert it to a palindrome by adding characters in front of ...

  5. Linux下实现C++类的动态链接

    1. 背景 在java中,jvm支持类的动态链接(Class.forName(String className)),用起来也很方便.动态链接是实现IOC(Inversion of Control,控制 ...

  6. hdr_beg(host) hdr_reg(host) hdr_dom(host)

    case 1 测试hdr_beg(host) 的情况 acl zjtest7_com hdr_beg(host) -i zjtest7.com use_backend zjtest7_com if z ...

  7. JavaScript DOM高级程序设计 5动态修改样式和层叠样式表1(源代码)--我要坚持到底!

    W3C DOM2样式规范 现在这边贴出本章要的源代码,注意要结合前面用到的ADS库http://vdisk.weibo.com/s/Dq8NU CSSStyleSheet对象属性: type :始终是 ...

  8. OSI模型七层模型结构

    OSI模型,即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model ...

  9. chrome渲染hover状态tranform相邻元素抖动bug

    最近同事在使用 css3 的 transition + tranform 的时候影响了相邻的元素出现bug.或者说相邻的元素出现抖动bug. 然而把 hover 状态的 tranform 属性删了后, ...

  10. Hibernate数据库持久层框架

    Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...