看了各种前辈写的东西后自己做的一个总结。既然叫快速幂,那就是比平常方法算来的要来的快,拿2^11来说,普通方法我们要算10遍,即第1次我们要算a=2*2;第二次算a*2;......直到第10次a=2*2*2*2*2*2*2*2*2*2*2;而这个快速幂呢,我们只需要把指数11拆分成二进制,11=2^3+2^1+2^0;只需算3遍,提高了效率。
我们还需要分情况,判断指数是奇数的情况与是偶数的情况。
当指数是奇数的情况:a^b=a*a^(b-1)=a*a^[(b-1)/2]^2依次往下,举个栗子:2^5=2*2^4=2*(2^2)^2;
当指数是偶数的情况:a^b=a^(b/2)^2=(a^2)^(b/2)依次往下,再举个栗子:2^6=(2^3)^2=(2^2)^2*2;
若为偶数,则将指数b除以2,再整体平方,然后b/2可能是奇数,可能是偶数,如果是奇数和下列是奇数的方法相同,如果是偶数就不断重复/2即可。a*=a;
若为奇数,则先提出来一个a,先把它存入ans中,写出来即是ans*=a;
这里的b&1是判断b是奇数(这里b是二进制)因为在二进制中最后一位数如果是0就是偶数,是1就是奇数。
如果b(指数)是奇数就先将一个底数放入ans中,提出来一个底数后剩下部分的指数就是偶数就a=a*a;如果b为偶数就跳过判断直接a=a*a;
然后这里的b>>=1,就是让b的二进制去掉最后一位,然后前面补0。
如果看到这里还不明白┑( ̄Д  ̄)┍附上一个栗子:比如求2^11。
a=2,b=11.
①11的二进制是1011.b=1011,最后一位为1,是奇数。ans=1*2; a=2*2=2^2. b=0101.
②b=0101,为奇,ans=2*(2*2)=2^3; a=2^2*2^2=2^4. b=0010.
③b=0010,为偶,ans不变还是2^3,a=2^4*2^4=2^8.b=0001.
④b=0001,为奇,ans=2^3*2^8=2^11.a=2^8*2^8=2^16.b=0000.跳出循环return ans=2^11.