劍指 Offer 16. 數值的整數次方 - 7月31日
阿新 • • 發佈:2020-07-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; } };*/
拓展學習
快速求冪套路模板要熟悉