我是直接模拟的,因为实在想不到什么好办法,不过看到0<k<14,
俗话说得好,不管黑猫白猫,抓到老鼠的就是好猫。
于是在自家电脑模拟,打个表,就AC了。
至于还有没有其他方法,有待研究,大家有什么好方法,请赐教,谢谢!
1、模拟:
方法是,m从2开始判断,在1,2,3,······,2k中,每次找到第m个数,判断如果是大于k的,
那么后面的数就向前移,否则m++,直至找到这样的m,使得找出的k个数都是大于k,
这个m就是要找的最小的m。(也可以使用链表,不过本人还没学过链表,所以不在这介绍了,
可参考百度百科:http://baike.baidu.com/view/213217.htm?fr=aladdin
#include<stdio.h>
int main()
{
int k,m,i,n,x,j;
int a[27];
bool bo;
scanf("%d",&k);
while(k)
{
for (i=1;i<=2*k;i++) a[i]=i;
m=1;
bo=false;
while(!bo)
{
m++;x=1;bo=true;
for (i=2*k;i>=k+1;i--)
{
n=m%i;
if (n==0) n=i;
n=(n+x-1)%i;
if (n==0) n=i;
if (a[n]<=k)
{
bo=false;
break;
}
for (j=n;j<i;j++) a[j]=a[j+1];
x=n;
}
}
printf("%d\n",m);
scanf("%d",&k);
}
return 0;
}
2、绝对0s算法:
#include<stdio.h>
int main()
{
int k,a[13]={2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
scanf("%d",&k);
while(k)
{
printf("%d\n",a[k-1]);
scanf("%d",&k);
}
return 0;
}