【算法记录】快速幂

要做a^b计算,相比于用循环把a连续乘b-1次,快速幂的时间复杂度要低很多,可以实现程序的时间优化和在比赛时防止超时。

public class Main{  
        public static void main(String[] args) {
        	Scanner in=new Scanner(System.in);
        	
        	long a=in.nextLong();
        	long b=in.nextLong();
        	
        	long ans=1;
        	long base=a;
        	
        	while(b>0) {
        		if((b&1)==1) {//最右的二进制位是1
        			ans*=base;
        		}
        		base*=base;
        		b>>=1;
        	}
        	System.out.println(ans);
        }   
    } 

用右移运算分别取得b的二进制的每一位,

比如4^{9},写作4^{(1000)_{2}},可以通过return (1\times4^{8}\times (0\times4^{4}\times (0\times4^{2}\times (1\times4^{1})来计算。其中的"8、4、2、1"是遵循2^{n}(n>=0)规律的。其实不一定要遵循2^{n}(n>=0),只是这样的规律便于用公式实现。

 

这样算的目的是将“把指数的数量的所有底数相乘”这个过程变成了“把一部分多底数相乘的值和另一部分多底数相乘的值相乘”,

即4 \times 4 \times 4 \times 4 \times 4 \times 4 \times 4 \times 4变成4^{8} \times 4^{1}


另外,可以参考这个:用java学算法(一) 快速幂与大数快速幂

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值