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.
");
    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来实现“环”结构。
原文地址:https://www.cnblogs.com/mrbourne/p/9959470.html