1. 程式人生 > 實用技巧 >劍指 Offer 16. 數值的整數次方 - 7月31日

劍指 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; } };
*/

拓展學習

快速求冪套路模板要熟悉