问题:求解pow(x,n)
解题思路:
1.将n个x相乘,时间复杂度为O(n)
2.分治思想:
-
二进制数转化成10进制数的方法:二进制数为n = 2k-1 * ak + 2k-2 *ak-1+....+ 21 * a2+ 20 * a1;
所以可以将xn=x (2^K-1) * ak + (2^k-2)*ak-1+....(2^0)*a1
上式=(x (2^K-1) * ak )* (x (2^K-2) * ak-1 )*.....*(x (2^i-1) * ai )*....*(x (2^0) * a1 )
- 将求n个k相乘的问题转化为以下两个问题:
1.计算 x2^0+2^1+..2^k-1
解决方法:
x=x2;
2.求二进制数ak到a1
解决方法:
采用>>右移位运算符号:将十进制数的二进制数形式的最右边一位数删除,即n>>=1;
&与操作:判断最后一个数是否为1,若为1,则乘入返回的幂函数当中;
从最后一位数开始往前,如果判断第i位的二进制数不为0,则将第i位的x进行res*=xn
3.代码清单
int pow(int x,int n){ int res = 1; while(n){ if(n&1)//位运算判断最后一位是否为1 res*= x; x*= x; n >>= 1;//删除二进制中的最后一位元素 } return res; }
4.算法性能分析
将原来求n个x相乘的问题转化为求(log2n)个关于n的二进制变式,时间复杂度为O(log2n);
标签:思想,二进制,res,ak,分治,a1,int,相乘,快速 From: https://www.cnblogs.com/higer-TSW/p/17205464.html