/*
之所以采用从0——k-1进行编号,是因为求余数的原因,比如1-6对6求完余数后是0-5,而如果采用对7求余数的话,
虽然能暂时表示1-6之间的数字,但如果m取7的话,本来应该是第一个人被杀的,所以结果不正确。
*/
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int people[30]={0},joseph[14]={0};
int k,m;
while(scanf("%d",&k)!=EOF&&k)
{
if(joseph[k])
{
printf("%d\n",joseph[k]);
continue;
}
int n=2*k;
m=k+1;
for(int i=1;i<=k;i++)
{
people[i]=(people[i-1]+m-1)%(n-i+1); //第几个人被杀死。其值表示的是被杀的是第几个位置。
if(people[i]<k)
{
i=0;
m++;
}
}
joseph[k]=m;
printf("%d\n",m);
}
}
POJ 1012(特殊的约瑟夫问题)
最新推荐文章于 2023-01-14 23:08:32 发布