这篇文章的难点在于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;
}
如果有比第二段代码还快的优化,欢迎来私聊