题目描述
求m的n次方(12<m,n<=130000000000)的最后三位数。
例如:13的13次方的最后三位数是253,13的20次方的最后三位数是801。
输入
有多组测试数据 每组测试数据一行,包含2个数据,即整数m和n,两个数用逗号隔开。
输出
每行输出m的n次方的最后三位数。
样例输入
13,13
13,20
样例输出
253
801
经过我多次输入测试,我发现m的n次幂结果只和n的后两位数有关,而且后三位数只由两个相乘的数的后三位有关,为此我才设置了if(n<10000)来验证,所以我的代码是这样的:
#include <stdio.h>
int main()
{
long long m,n,i,j;
while(scanf("%lld,%lld",&m,&n)!=EOF)
{
m%=1000;
j=m;
if(n<10000)
{
for(n; n>1; n--)
{
i=m*j;
j=i%1000;
}
}
else
{
n%=100;
for(n; n>1; n--)
{
i=m*j;
j=i%1000;
}
}
i%=1000;
printf("%03lld\n",i);
}
return 0;
}
但是测试一直过不去,然后我又看到了一个能过去的代码,虽然好像这代码不太正确,但是我俩测试的数据都符合,找不到原因。
能过的代码:
#include<stdio.h>
int main()
{
long long int i,x,y,last; /*变量last保存求X的Y次方过程中的部分乘积的后三位*/
// 输入
while(scanf("%lld,%lld",&x,&y)==2)
{
last=1;
x %= 1000; // 因为一个三位数的n次方的最后三位数只和这个数的最后三位数有关
y%=100; // 因为可以发现这个是一个轮回,也就是说 (13,13)==(13,113)
// 需要注意轮回的起始位置是13
if(y<13)
{
y+=100;
}
// 核心计算
for(i=0; i<y; i++)
last=last*x%1000;
// 补充0
if(last<100)
{
printf("0");
if(last<10)
{
printf("0");
if(last<1)
{
printf("0\n");
continue;
}
}
}
printf("%d\n",last%1000); /*打印结果*/
}
return 0;
}
本代码转载自CSDN博主「smile-yan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/smileyan9/article/details/80773994?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167712000616800192244692%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167712000616800192244692&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-80773994-null-null.142^v73^wechat_v2,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=m%E7%9A%84n%E6%AC%A1%E6%96%B9%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%89%E4%BD%8D%E6%95%B0&spm=1018.2226.3001.4187