K尾相等数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。下面请编程求出M+N最小的K尾相等数。
- 解题思路:每次相乘后都取余,以余数为索引将指数存到数组中,若余数相同的存在,则直接返回当前指数与对应数组元素的和。经典题。
- (之前的想法是新得到的数再与前面的逐一比较,比较麻烦比较费时,参考别人的做法,是直接以得到的数为下标存入数组,再与之比较的时候直接就比较了,省时省事)
- 代码如下:
-
#include <stdio.h>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int s[1010]={0};
int i,j,k,t,m;
scanf("%d",&k);
t=1;m=0;
while(t<1000)
{
t*=k;
m++;
}
t=t%1000;
s[t]=m;
k=k%1000;
while(1)
{
t*=k;
t=t%1000;
m++;
if(s[t])
{
printf("%d\n",m+s[t]);
break;
}
else
s[t]=m;
}
}
return 0;
} -
1 #include <stdio.h> 2 int main() 3 { 4 int T; 5 scanf("%d",&T); 6 while(T--) 7 { 8 int s[1010]={0}; 9 int i,j,k,t,m; 10 scanf("%d",&k); 11 t=1;m=0; 12 while(t<1000) 13 { 14 t*=k; 15 m++; 16 } 17 t=t%1000; 18 s[t]=m; 19 k=k%1000; 20 while(1) 21 { 22 t*=k; 23 t=t%1000; 24 m++; 25 if(s[t]) 26 { 27 printf("%d\n",m+s[t]); 28 break; 29 } 30 else 31 s[t]=m; 32 } 33 } 34 return 0; 35 }