• 剑指 Offer 16. 数值的整数次方


    题目

    剑指 Offer 16. 数值的整数次方

    我的思路

    很明显,这里考的也就是“快速求幂”法。其中有二分思想。

    虽然是二分法,但这里不用left和right来确定上下界,而是用幂次的2进制表示的右移操作>>以及与操作&来实现快速求幂!

    套路:

    exponent = i0*2^0+i1*2^1+...+i(n-1)*2^(n-1)

    base^exponent = base^(i0*2^0)  *  base^(i1*2^1)  *  base^(i2*2^2)  *...

    当剩余幂次>0时:

      幂次最低位若是1,那么结果累乘上当前幂;若是0,无操作;

      更新当前幂:更新方法,当前幂自己平方。

      幂次右移1位;

    我的实现

    class Solution {
    public:
        double myPow(double x, int n) {
            long longn = n;
            if(x == 1 || n ==0) return 1;
            if(longn<0){
                longn = longn * (-1);
                x = 1/x;
            }
            double result = 1;
            while (longn){
                if (longn & 1) result = result * x;
                x = x * x;
                longn = longn>>1;
            }
            return result; 
        }
    };
    /*
    不用考虑大数问题是什么意思??
    快速求幂?
    待优化!快速求幂套路写法
    优化前的代码如下:
    class Solution {
    public:
        double myPow(double x, int n) {
            int ci = 1;
            vector<double> tools;
            tools.push_back(1);
            long n1 = n;
            if(n<0){
                x = 1/x;
                n1 = -n1;
            }
            double cd = x;
            if(n1>0||n1<0) 
            tools.push_back(x);
            while(n1-ci>ci){
                cd = cd * cd;
                ci = 2 * ci;
                tools.push_back(cd);
                std::cout<<ci<<"	"<<cd<<endl;
               // x^n==(x^(n/2))^2
            }
            
            int r = tools.size()-1;
            cd = 1;
            cout<<"r:"<<r<<"	tools:"<<tools[r]<<endl;
            while(n1!=0){
                while(n1<ci){
                    ci = ci/2;
                    --r;
                }
                n1 = n1 - ci;
                cd = tools[r] * cd;
            }
            return cd;
            /*if(n==0)return 1;
            if(n>0) 
            {
                if(n)
            }return myPow(x,n-1)*x;
            else return myPow(x,n+1)/x;
        }
    };
    */

    拓展学习

    快速求幂套路模板要熟悉

  • 相关阅读:
    阿里巴巴的26款超神Java开源项目
    10个爬虫工程师必备的工具
    微服务的发现与注册--Eureka
    国内最火5款Java微服务开源项目
    LeetCode 700. 二叉搜索树中的搜索
    LeetCode 104. 二叉树的最大深度
    LeetCode 908. 最小差值 I
    LeetCode 728. 自除数
    LeetCode 704. 二分查找
    LeetCode 852. 山脉数组的峰顶索引 (二分)
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13409198.html
Copyright © 2020-2023  润新知