• 【Pow(x,n)】


    题目:

    Implement pow(xn).

    代码:

    class Solution {
    public:
            double myPow(double x, int n)
            {
                double ret = Solution::positivePow(fabs(x), abs(n));
                if ( n>0 )
                {
                    if ( x<0 && n&1 )
                    {
                        return -1 * ret;
                    }
                }
                else
                {
                    if ( x<0 && abs(n)&1 )
                    {
                        return -1 / ret;
                    }
                    return 1 / ret;
                }
                return ret;
            }
            static double positivePow(double x, int n)
            {
                if ( n==0 ) return 1;
                if ( n==1 ) return x;
                double v1 = Solution::positivePow(x, n/2);
                double v2 = n&1 ? x : 1;
                return v1 * v1 * v2;
            }
    };

    tips:

    1. 考察binary search的思想,把计算复杂度由O(n)降低为O(logn)

    2. 有个细节就是判断奇数偶数的时候,用bit判断,效率能略高一些。其实自己对计算机内部怎么执行加减乘除的原理应该是学过,但是忘记了,回头复习下。

    ===========================================

    第二次过这道题,参考了之前的思路,分类讨论细一些,一次AC了。

    class Solution {
    public:
            double myPow(double x, int n)
            {
                double ret = 0;
                ret = Solution::pow(fabs(x), abs(n));
                if ( x>0 )
                {
                    if ( n>=0 )
                    {
                        return ret;
                    }
                    else
                    {
                        return 1 / ret;
                    }
                }
                else
                {
                    if ( n & 1 )
                    {
                        if ( n>0 )
                        {
                            return -ret;
                        }
                        else
                        {
                            return -1 / ret;
                        }
                    }
                    else
                    {
                        if ( n>0 )
                        {
                            return ret;
                        }
                        else
                        {
                            return 1 / ret;
                        }
                    }
    
                }    
            }
            static double pow(double x, int n)
            {
                if (n==0) return 1;
                if (n==1) return x;
                double val = Solution::pow(x, n/2);
                double remain = n & 1 ? x : 1;
                return val * val * remain;
            }
    };

     =====================================

    第三次过,代码简洁了一些。主要是把x为0单独处理一下。

    class Solution {
    public:
        double myPow(double x, int n)
        {
            double ret = 0;
            if ( fabs(x-0)<1e-9 ) return 0.0; 
            ret = Solution::pow(fabs(x), abs(n));
            if (x>0)
            {
                if ( n<0 )
                {
                    ret = 1.0 / ret;
                }
            }
            else
            {
                if ( n & 1 )
                {
                    ret = -ret;
                }
                if ( n<0 )
                {
                    ret = 1.0 / ret;
                }
            }
            return ret;
        }
        static double pow(double x, int n)
        {
            if (n==0) return 1;
            if (n==1) return x;
            double val = Solution::pow(x, n/2);
            double remain = n & 1 ? x : 1;
            return val * val * remain;
        }
    };
  • 相关阅读:
    Prototype源码浅析——String部分(四)之补充
    改造alert的引发的争论【基本类型与引用类型】
    Eclipse rcp 窗口激活
    Eclipse statusLine 加入进度信息
    线的匹配
    python 文本搜索
    Eclipse rcp 编辑器行号显示
    CDT重建索引
    Eclipse rcp 数据存储
    CTabFolder 最大最小化
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4538044.html
Copyright © 2020-2023  润新知