题目:
题目原意:
求出A的B次方的结果的后三位数的值。
思路一:建立循环,将A相乘(B-1)次,求出来的结果赋给另外定义的一个值c,再除1000取余,所得值既是输出结果;
问题所在:求出来的值c可能是大于10的8次方,这样变量c不够储存这个值,造成溢出,得到一个负数。思路一不可行。
思路二:将A赋给c,通过循环每次将c乘A的值再除以1000取余,得到值赋给c(同余定理),最后直接输出值c,这样c的值就不会由于数值过大造成溢出。
代码如下:
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
while(cin>>a>>b)
{
if(a==0&&b==0){break;}
if((a>=1&&a<=10000)&&(b>=1&&b<=10000))
{
c=a;
int i;
for(i=0;i<(b-1);i++)
{
c=c*a%1000;
}
cout<<c<<endl;
}
}
return 0;
}
思路二中的同余定理,即当c*A大于1000时,(c*A-c*A%1000)这一部分肯定是1000的n倍(n大于0且为整数),所以这一部分在下一轮的循环中乘A再除以1000,它的余数还是0,所以这一部分可以删掉,只用c*A%1000来循环求出最终的余数结果就可以了,避免造成存储压力。。。