快速冪運算(非大數)

來源:互聯網
上載者:User

標籤:

快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 O(log?N), 與樸素的O(N)相比效率有了極大的提高。

 

下面以3­16 為例:

 

一般運算方式是:

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 }

如有錯誤,歡迎指出

快速冪運算(非大數)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.