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

2021-09-08 20:49:25 字數 1294 閱讀 1379

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

void main(void

) cout

<}

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

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

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

下面優化一下上面的**:

void main(void

) a *=a;

//每次除以2,轉換成二進位制位

b /= 2

; }

cout

<}

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

迴圈次數

二進位制位

ans值

a值b值

01011a

511012a2

221012a4

13101

32a16

0 從上表我們可以直觀的看出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 312 6

6789 10000

0 0樣例輸出:

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

好吧,給出**:

void main(void

) a *=a;

a %= 1000

;

//每次除以2,轉換成二進位制位

b /= 2

; }

cout

<}

}

二分求冪,快速求冪

1 2 3 4 5 6 7 8 9 10 11 12 intpow3 inta,intb returnr 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 intpow4 intx,intn result x n 1 whil...

常規求冪 二分求冪 快速位求冪

題目描述 給定數字a,b,求a b。思路 解法包括常規求冪 二分求冪 快速求冪 位運算 每一種求法中,要根據b的值進行討論,b 0,0,0。1 常規求冪 常規求冪即是根據ans a a a a。根據b的個數來就行求解 2 二分求冪 二分求冪是可以將乘法進行分組 比如a a a a a a a a a...

常規求冪 二分求冪 快速位求冪

我是因為刷杭電的題目了解到了冪運算,那就貼一下杭電的題目好了 然後在貼一下別人關於冪運算的部落格 題目描述 給定數字a,b,求a b。思路 解法包括常規求冪 二分求冪 快速求冪 位運算 每一種求法中,要根據b的值進行討論,b 0,0,0。1 常規求冪 常規求冪即是根據ans aaa a。根據b的個數...