int cal(int x, int n, int max){
int sum = 1; //最後輸出的結果
while (n > 0){ //當冪降為0是結束
if (n & 1) //位運算,&是按位與,當兩邊都為1,表達式為1,這個是用來判斷二進制數最後一位是否為1,這裡n是以二進制的形式比較的
sum = sum*x%max;//如果為1,sum就要乘x^i,i為該位在二進制數中的位置
n >>= 1; //>>為位運算符,右移一位,即去掉已經計算過的部分
x = x*x%max; //用來標記記錄x^2^i,循環i次即去掉了i位,當第i+1位為1時,sum就要乘x^2^i;
}
return sum;//循環結束返回結果。
}
現在來講max的作用,用來把數變小的,我們可以想象如果是很大的數的很高次方,乘幾次後數據非常大無法用任何一個基本數據類型表示,而且這也是不必要的,通常我們只需要知道最後若干位的值,這就可以用到取余了,余數的冪和原數的冪在余數的位數上是相同的,所以每次進行乘法運算後都要取余,當然如果數據很小也可以不用取余。
好了,感覺我已經講的很詳細了!!真的是盡力了。。。
下面貼上上面那題的代碼
1 #include<iostream>
2 using namespace std;
3
4 int cal(int x, int n, int max){
5 int sum = 1;
6 while (n > 0){
7 if (n & 1)
8 sum = sum*x%max;
9 n >>= 1;
10 x = x*x%max;
11 }
12 return sum;
13 }
14 int main(){
15 int x, n;
16 while ((cin >> x >> n) && (x || n)){
17 cout << cal(x, n, 1000) << endl;
18 }
19 return 0;
20 }