关于快速幂的个人理解

     看了各种前辈写的东西后自己做的一个总结。既然叫快速幂,那就是比平常方法算来的要来的快,拿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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值