【OJ题集】m的n次方的最后三位数

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;
}

提交这个代码上去,就不会出现时间超限这个错误了。

经历了二十多次失败的我也总算成功了。

猜你喜欢

转载自blog.csdn.net/smileyan9/article/details/80773994