剑指 Offer 16. 数值的整数次方 - 7月31日

题目

剑指 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<<"\t"<<cd<<endl;
           // x^n==(x^(n/2))^2
        }
        
        int r = tools.size()-1;
        cd = 1;
        cout<<"r:"<<r<<"\ttools:"<<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;
    }
};
*/

 

拓展学习

快速求幂套路模板要熟悉

posted on 2020-07-31 13:33  BoysCryToo  阅读(107)  评论(0编辑  收藏  举报

导航