快速冪的目的:
做到快速求冪。假設我們要求a^b,按照樸素算法就是把a連乘b次,這樣一來時間複雜度是O(b)也即是O(n)級別。如果n非常大時,就會超時。而快速冪的時間複雜度爲O(logn)。
快速冪的原理:
假設我們要求a^b,其實b是可以拆成二進制的,該二進制數第i位的權爲2^(i-1),例如當b==11時,
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1, 11的二進制是1011,因此a¹¹可以轉化爲算 a^(2^0)*a^(2^1)*a^(2^3),從而可以將原來計算11次轉爲現在算三次。
實現代碼:
int poww(int a,int b){
int ans=1,base=a;
while(b!=0){
if(b&1!=0)
ans*=base;
base*=base;
b>>=1;
}
return ans;
}
以b=11爲例,b=1011,二進制從右向左算,但乘出來的順序是 a^(2^0)*a^(2^1)*a^(2^3),是從左向右的。
我們不斷的讓base*=base目的即是累乘,以便隨時對ans做出貢獻。
base*base==base^2,下一步再乘,就是base^2*base^2==base^4,然後同理 base^4*base4=base^8,指數正是 2^i 。