/*
*从键盘输入一个自然数K(K > 1),若存在自然数M和N(M > N),使得K^M和K^N均大于或等于
*1000,且它们的末尾三位数相等,则称M 和 N是一对“K尾相等数”。请编一程序,输出M+N
*值最小的K尾相等数。
*对于一个数,它的幂是无穷无尽的,但是可以注意到末尾三位数只有1000个,也就是表明一定
*会有重复的末尾三位数,当一个数的末尾三位数一定时,它的下一次幂的末尾三位数也一定了。
*也就是表明当第一次重复出现大于等于1000的末尾三位数时,这就是我们要求的M和N。
*从键盘输入一个自然数K(K > 1),若存在自然数M和N(M > N),使得K^M和K^N均大于或等于
*1000,且它们的末尾三位数相等,则称M 和 N是一对“K尾相等数”。请编一程序,输出M+N
*值最小的K尾相等数。
*对于一个数,它的幂是无穷无尽的,但是可以注意到末尾三位数只有1000个,也就是表明一定
*会有重复的末尾三位数,当一个数的末尾三位数一定时,它的下一次幂的末尾三位数也一定了。
*也就是表明当第一次重复出现大于等于1000的末尾三位数时,这就是我们要求的M和N。
/
1.如果不考虑空间因素,构造1000数组,将每个i次数的i存入以它的尾数最后三位数x的n[x]中,如果发现n[x]已经存入,就可以将i与n[x]相加,得出结果。
2.因为只考虑尾数即可,为了防止溢出,可以将阶乘num 等效看成(1000+尾数)
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
double num = 0;
int n[1000]={0};
int i=1,m=0;
int myn=0;
while(1)
{
cin>>num;
myn=num;
if(num>10000)
num=1000+myn%1000;
for(i=0;i<1000;i++)
n[i]=0;
i=1;
m=0;
if(myn==1)
break;
while(myn<1000) // n>=1000
{
i++;
myn=myn*num;
}
myn=myn%1000;
n[myn]=i;
i++;
myn=myn*num;
myn=myn%1000;
while(n[myn]==0)
{
n[myn]=i;
i++;
myn=myn*num;
myn=myn%1000;
}
m = n[myn]+i;
cout<<m<<endl;
}
return 0;
}