题目描述
计算x的n次幂,不能用pow函数
算法原理
因为要计算x的n次幂,直接通过for循环计算时间复杂度较高,可以通过快速幂来计算
假如x=2,n=10,10的二进制表示方法为
1010
n | 0 | 1 | 0 | 1 | ||
1 | 2 | 4 | 8 | 16 | 32 | |
x | 2 | 2*2=4 | 4*4=16 | 16*16=256 | 256*256=65536 | 65536*65536=4,294,967,296 |
x=x | x=x*x | x=x*x | x=x*x | x=x*x | x=x*x |
根据上面的公式,则可以推断出,当n每次右移一位,相当于当前的值为当前的x*x,如果这一位为1就相当于当前位的ans*=x,否则则只有x*x,继续进行下一步判断,而循环结束的条件是n==0,也就是通过n的不断右移到为0的时候
核心代码实现
while(n!=0){ //当n==0的时候循环截止
if(n&1){ //如果n的当前位为1,说明最终答案ans需要*x
ans*=x;
}
n=n>>1; //n右移一位
x*=x; //x乘以本身,相当于下一位的结果
}
时间复杂度大大减小
例题