题目描述
求13的n次方(12<n≤130000000000)的最后三位数。例如:13的13次方的最后三位数是253,13的20次方的最后三位数是801。
输入
有多组测试数据,每组测试数据一行,即整数n。以文件结尾符结束。
输出
输出13的n次方的最后三位数。
样例输入
13
20
样例输出
253
801
提示
本题用64位数据类型也解决不了问题,因为13的n次方可能会非常大,所以要简化问题。不难发现,2个数乘积的后三位实际上只跟乘数的后三位有关,利用这一特点,可使问题大大简化。另外,n可达10的11次方,如果真的循环做n次乘法,肯定也会超时,所以,就要考虑减少乘法次数。考虑到连续乘的是"同一个数",后三位数值变化一般具有周期性。那如何检测周期长度呢?如果第1次遇到后三位数为XYZ,在不断累乘的过程中,后三位数再次是XYZ时,即可界定一个周期。
#include <stdio.h>
#include <string.h>
int a[101];
char n[15];
int main(int argc, char* argv[])
{
int aculation = 1;
a[0] = 1;
unsigned int i;
for (i = 1; i < 101; i++)
{
aculation = aculation * 13 % 1000;
a[i] = aculation;
}
while (scanf("%s", n) != EOF)
{
int temp;
temp = (*n - '0') * 10 + *(n + 1) - '0';
for (i = 2; i < strlen(n); i++)
{
temp = (temp * 10 + *(n + i) - '0') % 100;
}
printf("%03d\n", *(a + temp))
}
return 0;
}