由于数字较大,联想到末位数字只与每次运算结果的最后一位有关,因此先进行%10处理。
#include <cstdio>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
long long int N,sum=1;
scanf("%lld",&N);
int number=N%10;
for(int n=1;n<=N;n++)
{
sum=sum*number;
sum=sum%10;
}
printf("%lld\n",sum);
}
return 0;
}
然后就会发现…超时了。N的范围是10亿,而一秒只能运行10^8次。但其实最多只需要运行十次,因为末位数字总是在循环出现的。所以只要求出一个循环里面含有的数字个数,再计算出N应该与这个循环中的第几个数字相等即可。
#include <cstdio>
using namespace std;
int a[10];//在一个循环中最多有十个数字
int main()
{
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
long long int N;
int section=1,n;
//由于第一个else里面是直接break的,如果第一个就直接相等了,比如5,section也应该是1而不是0,因此初始化值是1。
scanf("%lld",&N);
a[0]=N%10;
int sum=a[0];
//sum初始化值为a[0],因为初始化为1的话则进入循环的第一个if一定相等。
for(n=1;n<10;n++)
{
sum=sum*a[0];
sum=sum%10;
if(sum!=a[0])
{
section++;
a[n]=sum;
}
else
break;
}
int row=N%section;
if(row==0)//注意没有余数时还是有一点点不一样的
sum=a[section-1];
else
sum=a[row-1];
printf("%d\n",sum);
}
return 0;
}