【算法记录】快速幂

要做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学算法(一) 快速幂与大数快速幂

发布了14 篇原创文章 · 获赞 33 · 访问量 9365
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章