日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二分求幂,快速求解a的b次幂

發布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分求幂,快速求解a的b次幂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一個引子

如何求得a的b次冪呢,那還不簡單,一個for循環就可以實現!

void main(void) {int a, b;int ans = 1;cin >> a >> b;for (int i = 1; i <= b; i++){ans *= a;}cout << ans; }

那么如何快速的求得a的b次冪呢?上面的代碼還可以優化嗎?

當然是ok的!下面就介紹一種方法-二分求冪。

二分求冪

所謂二分求冪,即是將b次冪用二進制表示,當二進制位k位為1時,需要累乘a的2^k次方。

下面優化一下上面的代碼:

void main(void) {int a, b;int ans = 1;cin >> a >> b;while (b != 0){//當二進制位k位為1時,需要累乘a的2^k次方,然后用ans保存if (b % 2 == 1){ans *= a;}a *= a;//每次除以2,轉換成二進制位b /= 2;}cout << ans; }

舉個例子,當b = 5時,b的二進制為101。

循環次數二進制位ans值a值b值
01011a5
11012a22
21012a41
310132a160

從上表我們可以直觀的看出5次冪就可以轉換為(2^0+2^2),即a的5次冪就轉變為a的(2^0+2^2)次冪,即a的2^0與a的2^2的乘積。

再來個例子-鞏固

此題來源于九度教程“人見人愛A^B”。

題目描述:

求A^B的最后三位數表示的整數。

輸入:

輸入數據包含多個測試實例,每個實例占一行,由兩個正整數a和b組成,其中(1<=a,b<=10000),如果a = 0,被= 0,則表示輸入數據結束,不做處理。

輸出:

對于每個測試實例,輸出a^b的最后三位表示的整數,每個輸出占一行。

樣例輸入:

2 3

12 6

6789 10000

0 0

樣例輸出:

8

984

1

對于這道題,完全可以用上面的二分求解方法,可以仿照上面的代碼進行實現。但是有一點需要注意的是,我們不肯能定義一個整型變量或者long long類型的變量取保存如樣例給出的數據a = 6789,b=10000,a^b的計算結果。因為數字太龐大了,在整數范圍內是無法表示的。所以我們可以只保存每次計算結果的后三位,因為最終結果的后三位取決于其中間值的后三位。

好吧,給出代碼:

void main(void) {int a, b;while ((cin >> a >> b)){int ans = 1;if (a == 0 && b == 0)break;while (b != 0){//當二進制位k位為1時,就累加a的2^k次方if (b % 2 == 1){ans *= a;ans %= 1000;}a *= a;a %= 1000;//每次除以2,轉換成二進制位b /= 2;}cout << ans;}}

?

總結

以上是生活随笔為你收集整理的二分求幂,快速求解a的b次幂的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。