人见人爱A^B(HDOJ2035)

Problem - 2035

题目:


题目原意:

求出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来循环求出最终的余数结果就可以了,避免造成存储压力。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容