快速幂算法和大整数求模

                      ** 1.快速幂的算法**

(1)当我们求一个数的n次方的的结果时,若直接选择for循环,来累乘的话,效率很低,时间复杂度位O(n),而当我们选择快速幂来计 算时,时间复杂度能达到O(logn),快了很多。快速幂的基本方法基于二进制,将n次方分解,每次计算平方。如下:
假设我们要求5^23(5的23次方),因为23换为二进制为:10111。即2^4*1+2^3*0+2^2*1+2^1*1+2^0*1,那么5^23次方就可以转换,为:5^(2^4*1)*5^(2^3*0)*5^(2^2*1)*5^(2^1*1)*5^(2^0*1)。基于这个公式,我们计算5^23次方就只需要5步就算出来了,原来则需要计算23次。效率提高不少,特别是当n为很大的时候,效率更高。那么,现在有个问题,怎么算这五步呢?思路如下:

1.观察这五个等式,从高到低依次为5^16,5^8(虽然没有,但规律是这样),5^4,5^2,5^1[前一项是后一项的平方]
2.我们可以通过&1来得到一个数的最后一位,可以通过>>符号将二进制往右边移一位。
有了上面两点,我们来实现快速幂的算法:

         long quick(long a,long n){
                            long base=a; 
                            long res=1;
                            while(n!=0){   //判断次方n的二进制是否已经移动完了
                                if((n&1</
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值