標籤:
快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 O(log?N), 與樸素的O(N)相比效率有了極大的提高。
下面以316 為例:
一般運算方式是:
316 = 3*3*3*3……*3
這樣的話需要運算15次
而快速冪運算的方式是:
316 = (32)8 = ((32)2)4 = (((32)2)2)2
這樣的話只需要運算4次
不難看出,快速冪運算其實就是每次運算時把底數平方,指數減半,從而提高效率。
顯然,當指數為奇數時,我們要作一些特殊處理:
以711為例:
711 = 710 * 7 = (72)5 * 7 = (72)4 * 72 * 7 = ((72)2)2 * 72 * 7
其實與前面的運算差異不大,當指數為奇數時,只需要從指數裡取出1來單獨運算即可。
以下為遞迴實現快速冪代碼:
1 #include <stdio.h> 2 typedef long long int LL; //為long long int 定義別名 LL 3 LL FastPower(LL a, LL b, LL c) //a為底數,b為指數,c用來儲存單獨運算的乘積 4 { 5 if(b == 0) //任何數的0次方都為1(0的0次方有爭議,這裡預設為1) 6 return 1; 7 else if(b == 1) //遞迴出口 8 return a*c; //運算結束,返回結果 9 else if(b%2 == 1) //當指數為奇數時10 return FastPower(a*a, (b-1)/2, c*a); //從指數取出1來乘到c裡儲存起來,其他照常11 else //當指數為偶數12 return FastPower(a*a, b/2, c);13 }14 int main(void)15 {16 LL a, b;17 //測試18 while(~scanf("%lld %lld", &a, &b))19 printf("%lld^%lld = %lld\n\n", a, b, FastPower(a, b, 1)); //c的初始值應為1而不是020 return 0;21 }
運用上位元運算稍微最佳化一下代碼
1 #include <stdio.h> 2 typedef long long int LL; 3 LL QPower(LL a, LL b, LL c) 4 { 5 if(!b) 6 return 1; 7 else if(b == 1) 8 return a*c; 9 else10 return b&1 ? QPower(a*a, b-1>>1, a*c) : QPower(a*a, b>>1, c);11 }12 int main(void)13 {14 LL a, b;15 while(~scanf("%lld %lld", &a, &b))16 printf("%lld\n", QPower(a, b, 1));17 return 0;18 }
如有錯誤,歡迎指出
快速冪運算(非大數)