约瑟夫问题是经典的算法题,大多教材上都有的,以下是我写的,供参考:
#include
#define N 30
int yuesefu1(int data[], int sum, int k)
{
int i = 0, j = 0, count = 0;
while(count < sum - 1)
{
if(data[i] != 0) /*当前人在圈子里*/
j++;
if(j == k) /*若该人应该退出圈子*/
{
data[i] = 0; /*0表示不在圈子里*/
count++;/*退出的人数加1*/
j = 0; /*重新数数*/
}
i++;/*判断下一个人*/
if(i == sum) /*围成一圈*/
i = 0;
}
for(i = 0; i < sum; i++)
if(data[i] != 0)
return data[i];/*返回最后一个人的编号*/
}
int main()
{
int data[N], total, k, i;
while(1)
{
scanf("%d%d", &total, &k);
if(total == 0 || k == 0)
break;
for(i = 0; i < total; i++)
data[i] = i + 1; //初始化
printf("%d\n", yuesefu1(data, total, k));
}
return 0;
}