小明在中学会求一个数的 n 次方了,但计算机还不会,请你来编写一个程序吧。由于计算机比较“笨”,所以我们编写程序的功能不用太强,只要能算出 a 的 n 次方的最后 3 位数就可以了。
输入:
a 和 n 的值。假设 a<=150 。
输出:
求 a 的 n 次方的最后 3 位数。
提示:再想一想,你的方法对吗?你用的是什么数据类型?
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路:
看到题目,我们难免会觉得它太小儿科了:直接算输入值的n次方,再对1000取模不就行了?
然而我们看到测试用例3,100的10次方是100亿,这显然太大了。
那么如何优化程序呢?题目只要求输出最后三位数,它的数值和前面的数一点关系也没有。于是我们可以把n次方拆分成n次“乘以n”,每次“乘以n”后都让数值对1000取模,这样就不会有数值过大的问题了。最后的%03d代表让输出的数值占三位,不满三位在左侧补0。
#include <stdio.h>
int main(){
int a=0,n=0,p=1;
scanf("%d %d",&a,&n);
if(n==0)
{
printf("The last 3 numbers is 1.\n");
}
else
{
for (int i = 0; i < n; ++i)
{
p*=a;
p%=1000;
}
printf("The last 3 numbers is %03d.\n",p);
}
}