这篇文章的难点在于x,y<=1000000000,想要实现更多代码可以关注、评论、点赞本文章后私聊。

        因为C语言里面即使是规模最大的数据类型,也存不了十亿的十亿次方。因此,为了能够输出该结果,我充分利用“最后三位”这个条件,构建了我的程序。这是一个处理超大数据的思路,如果希望最终储存数据,很多博文里有讲过了,这里讲一下思路:转换为文本。

输入样例1:12 6

输出样例1:984

输入样例2:999 999

输出样例2:999

输入样例3:987654321 123456789

输出样例3:625

        仅仅是构造求x^y并输出后三位:

#include <stdio.h>
#include<math.h>
int main()
{
int i,x,y,s;
scanf("%d %d",&x,&y);
s=pow(x,y);
printf("%d",s%1000);
}

        这串代码很简单,也很清晰,但只能实现样例一。所以,我改变了数据类型,增加了一些优化。

        以下方法相对简单、运行时间较长,范围还是受到限制,能运行样例二:

#include <stdio.h>
int main()
{
long long i, x, y, last=1;                  
scanf("%lld %lld", &x, &y);
for(i=1; i<=y; i++)                 
last = last * x % 1000;        
printf("%lld", last);
return 0;
}

        为了降低运算量,我肝了两个小时查找资料,对它经过了以下优化后,得出这是计算量消耗更小的方法,能节省一大半内存占用,运行时间与方法比上一个方法快了近千倍,能运行样例三:

#include <stdio.h>
#define MAXN 1000000000
int main()
{
int  x, y,a,sum=1;                  
scanf("%d %d", &x, &y);
    a=x;
while(y>0)
    {
        if(y%2==1)
        {
            sum=sum*a%1000;        
            y=y-1;
        }
        y/=2;
        a=a*a;                
    }       
printf("%d", sum);
return 0;
}

如果有比第二段代码还快的优化,欢迎来私聊

Logo

助力深圳南山地区开发者在线学习与竞赛、技术交流与分享、职业发展,成为深圳开发者首选的工作与学习平台。

更多推荐