1. 程式人生 > >人見人愛A^B --二分求冪

人見人愛A^B --二分求冪

二分求冪

計算A^B可以使用最直接的方法,即累乘,但是還有更簡單的方式,例如計算2的32次方,假設計算到了2的16次方,我們還要繼續重複這個乘2的過程麼?更簡單的方式是平方,這樣就可以直接的到結果了,按照這種方式計算2的32次方,我們總共要計算6次,從2到2的平方,再到2的4次方,再到2的8次方,再到2的16次方,再到2的32次方,這樣看來,其實二次求冪的方式就是將A^B轉化為一系列A^N的乘積,其實這些乘積是有規律的,我們可以使用B的二進位制序列來表示,例如:
求解2^31, 我們先將31用二進位制表示 11111 = 2^0 + 2^1+2^2+2^3+2^4 其實結果本身就對應著2的0次,1次,2次,3次,4次的乘積。使用程式碼來表示(非遞迴):

int power(int a, int b){
    int ans = 1;
    while(b!=0){
        if(b%2)
            ans *= a;
        a *= a;
        b /= 2;
    }
    return ans;
}

例題

Problem Description

求A^B的最後三位數表示的整數。說明:A^B的含義是“A的B次方”。
Input

輸入資料包含多個測試例項,每個例項佔一行,由兩個正整數A和B組成(1<=A,B<=10000),如果A=0, B=0,則表示輸入資料的結束,不做處理。
Output

對於每個測試例項,請輸出A^B的最後三位表示的整數,每個輸出佔一行。
Sample Input

2 3
12 6
6789 10000
0 0
Sample Output

8
984
1

程式碼 & 分析

只是一個小小的變形,因為題目的輸入資料在經過次方運算之後會很大,所以但是隻是取最後三位數字的話,我們只可以在計算過程中不停的對1000取模,這樣一直保持在規模較小的計算上。主要還是二分求冪的方法。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace
std; int a, b; int ans = 1; int main(){ while(cin>>a>>b && a &&b){ ans = 1; while(b!=0){ if(b%2){ ans *= a; ans %= 1000; } a *= a; a %= 1000; b /= 2; } cout<<ans<<endl; } }