C语言约瑟夫环问题
约瑟夫环问题。采用某种数据结构表示约瑟夫环:设编号为1,2,3,…,n的n(0<n<50)个人顺时针方向围成一个环,每人手中持有一个正整数密码。开始时任选一个正整数m作为...
约瑟夫环问题。采用某种数据结构表示约瑟夫环:设编号为1,2,3,…,n的n(0<n<50)个人顺时针方向围成一个环,每人手中持有一个正整数密码。开始时任选一个正整数m作为报数上限,从编号为1的人开始起顺序报数,报到m时停止报数,同时,报m的出列,并将他持有的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人出列为止。求出出列编号序列。
展开
1个回答
展开全部
#include <stdio.h>
#define N 17 //人数
#define M 11 //出局人号码
void main()
{
int a[N], i, call_n = 0, out_n = 0;
for (i = 0; i < N; i++) a[i] = 0;
i = 0;
while (1) { //循环报数
if(a[i] == 0) { //如果健在
if (out_n == (N - 1)) break; //如果仅剩一人
call_n++; //报数
call_n %= M; //最大为M,到了M就从0开始
if(call_n == 0) {
a[i] = 1; //出局标记
out_n++;
printf("%d ", i + 1);//显示出局人号码
}
}
i++; i %= N; //循环转向下一人
}
printf("\n最后剩余者的编号是:%d\n", i + 1);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询