【算法記錄】快速冪

要做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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章