问题症结:
该题不能像抽屉原理2中,直接开一个1000多的数组来存放答案,直接按下标索引,按照这个方法,需要开的数组太大,1,000,000,000,内存撑不住。
解决办法:
题目要求直接取最后一位数,所以,10个数字必然至少有1个数字会重复出现,找出这个周期。找周期的方法:不能用刚开始的这一个数字作为开始找,因为最初的数字,在不稳定之前不一定会反复出现。故而该程序就取第10个数字(这个肯定会在后面重复出现的,故而可选),这里找出了周期。后面即将第10个数字作为基址,按照周期来查找。
题目背景:
代码:
#include<iostream>
using namespace std;
int main()
{
int n,m;
int val;
cin>>n;
int arr[32];
int dis;
while(n--)
{
cin>>m;
int mm = m;
m = m % 10;
val = m;
int i;
int st;
for(i=0; i<32; i++)
{
arr[i] = val;
val = val*m%10;
}
for(i=11; i<32; i++)
{
if(arr[i] == arr[10])
{
dis = i - 10;
break;
}
}
for(i=0; i<32; i++)
{
if(arr[i] == arr[10])
{
st = i;
break;
}
}
if(mm < 32)
{
cout<<arr[mm -1]<<endl;
}
else
{
i = (mm - 1 - st) % dis;
cout<<arr[st + i]<<endl;
}
}
return 0;
}