用链表是最好的
//用于标记人员是否出列,0没有出列,1出列
unsigned char flag[20];
//按出列顺序记录人员编号
unsigned char result[20];
//起始人员编号,n总人数,m报数上限
int joseph(int start, int n, int m)
{
int i = 1;
int k = start;
while (1)
{
if (flag[k] != 1)//跳过出列人员
{
if (i == m)
return k;//达到报数上限,则返回人员编号
else i++;
}
k = (k + 1) % n;//人员是围坐成环,达到数组尾巴,下标重置为0
}
}
int main()
{
int i;
int d = -1;
for (i = 0; i < 20; i++)
{
flag[i] = 0;
}
for (i = 0; i < 20; i++)
{
d = josef((d + 1) % 20, 20, 5);//假设n=20,m=5
result[i] = d;
flag[d] = 1;
}
return 0;
}