要做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的二進制的每一位,
比如,寫作,可以通過return (1) (0) (0) (1)來計算。其中的"8、4、2、1"是遵循(n>=0)規律的。////其實不一定要遵循(n>=0),只是這樣的規律便於用公式實現。
這樣算的目的是將“把指數的數量的所有底數相乘”這個過程變成了“把一部分多底數相乘的值和另一部分多底數相乘的值相乘”,
即4 4 4 4 4 4 4 4變成 。
另外,可以參考這個:用java學算法(一) 快速冪與大數快速冪