标签:
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 }
标签:
原文地址:http://www.cnblogs.com/wuyoucao/p/5008787.html