题目
剑指 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; } }; */
拓展学习
快速求幂套路模板要熟悉