C语言经典算法100例-069-简单约瑟夫环问题
这里我们实现一个简单的约瑟夫环问题,描述如下:
有N个人站成一圈,从第一个人开始报数,从1报到3,报到3的那个人走出圈,然后从下一个人开始从1继续报数,重复上面的过程,直到最后圈里只剩下一个人,问这个人是哪个人?
分析:首先,我们要给这N个人编号,分别编为1到N,
然后,开始报数,同时记录 当前编号,所报数,圈内人数,
只要圈内人数大于1,就一直重复,
报数过程中,如果所报数为3,那么要做这几件事:1,将这个人踢出圈 2,圈内人数减一 3,重置所报数。
具体实现起来如代码所示:
//n 个人,报数,去3,剩下几号-简单约瑟夫环问题
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 20
int main()
{
int Ring[MAX_SIZE];
int i, n;
int cnt; //代表报的数
int pos; //当前位置数
int num; //当前环中的人数
int *p = Ring; //用指针访问数组
//输入环中的初始人数
printf("input the n.\n");
scanf("%d", &n);
//输入一些元素
for (i = 0; i < n; i++)
*(p+i) = i+1;
//报数 去3
num = n;
pos = 0;
cnt = 0;
while (num != 1) //一直报到剩下一个人
{
if(*(p + pos) != 0) ++cnt; //对当前元素报数
if (cnt == 3) //报到3了
{
*(p + pos) = 0; //踢出环
--num; //环大小-1
cnt = 0; //重置报的数
}
++pos; //指向下一个元素
if(pos == n) //到环尾则返回环头
pos = 0;
}
while (*p == 0) p++; //找到最后剩下的那个元素
printf("%d is left",*p);
return 0;
}
这里用数组表示约瑟夫环,数组内元素置0表示不在环内,当位置累积到N时置0来实现“环”结构。