OJ题在线网址:http://acm.hnust.cn/JudgeOnline/problem.php?id=1787
【问题描述】
求m的n次方(12<m,n≤130000000000)的最后三位数。 例如:13的13次方的最后三位数是253,13的20次方的最后三位数是801。
【输入】
有多组测试数据 每组测试数据一行,包含2个数据,即整数m和n,两个数用逗号隔开。
【输出】
每行输出m的n次方的最后三位数。
【样例输入】
13,13 13,20
【样例输出】
253 801
【我的分析】
首先很容易百度得到这个算法,核心代码如下:
for(i=0; i<y; i++) last=last*x%1000;
但是问题在于如何改进算法,从而满足时间要求。
基本思路就是让for循环次数变小。
所有代码如下:
#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; }
提交这个代码上去,就不会出现时间超限这个错误了。
经历了二十多次失败的我也总算成功了。