poj 1012 Joseph
#include <iostream> //约瑟夫环
using namespace std;
int res[14];
bool Joseph(int k,int m)
{
int len=2*k,i=0;
while(len>k)
{
i=(i+m-1)%len; //i是被踢出的数的下标
if(i<k)return 0; //因为前k个都不能先选出来,所以前k个数的下标一直未变,只要i<k说明前k个数之一被踢出
//这样就不用把选中的数从数组中删除,并把每次删除的数与k进行比较,现在直接把坐标与k进行比较即可
len--;
}
return 1;
}
int main()
{
int k,i,j;bool tag;
while(scanf("%d",&k)&&k)
{
if(!res[k])
{
for(i=k;;i+=2*k)
{
tag=0;
for(j=1;j<=k;j++)
if(Joseph(k,i+j))
{
res[k]=i+j;
tag=1;
break;
}
if(tag)
break;
}
}
printf("%d\n",res[k]);
}
return 0;
}