C语言 问题 J: 高次方数

题目描述
求m的n次方(12<m,n<=130000000000)的最后三位数。
例如:13的13次方的最后三位数是253,13的20次方的最后三位数是801。
输入
有多组测试数据 每组测试数据一行,包含2个数据,即整数m和n,两个数用逗号隔开。
输出
每行输出m的n次方的最后三位数。
样例输入
13,13
13,20
样例输出
253
801

img

经过我多次输入测试,我发现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

给文字 ,别发图片

这两份代码的主要区别在于处理n的方式。第一个代码中使用了if语句来判断n的大小,然后进行不同的处理;而第二个代码中通过取余运算将n限制在100以内,然后进行计算。

在第一个代码中,if语句判断的条件是n<10000,但实际上不是所有的m和n都满足这个条件。因此,在一些情况下,第一个代码会得出错误的结果。

而第二个代码中,通过将n限制在100以内,将问题转化为求x^y的后三位数,即使得代码更为简洁。

建议您对第二份代码进行适当修改,将变量类型更改为long long,以适应较大的n。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这篇的方法在这个题目里不行,n太大了,很容易超时。