约瑟夫环问题(一)(难度:1颗星)

问题描述:

编号为1,2,…,n的n个人按顺时针方向围坐一圈,任选一个正整数作为报数上限m,从第一个人开始按顺时针方向从自1开始顺序报数,报道m时停止报数.报m的人出列,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序.

输入输出描述:

m和n由用户输入,并且保证m和n的范围是【1,1000】,输出出列序列。

问题分析:

因为这个是要求出所有的出列序列,所以目前还没想到效率更高的方法,只能用模拟法,时间复杂度是O(m*n),设置三个变量:

index:表示目前所执行的人的号码
count:表示目前报的数是多少
OutPeopleCount:表示目前出列的人数

如果是要求出最后一个出列人的标号,请参考我的另外一篇文章:
http://blog.csdn.net/yi_ming_he/article/details/72860011

参考代码:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main()
{
    int n, m, nIndex = 0, nCount = 1, nOutPeople = 0;
    scanf_s("%d%d", &n, &m);
    char *pIsOut = (char*)malloc(n * sizeof(char));
    memset(pIsOut, 0, sizeof(char)* n);
    while (1)
    {
        if (1 == pIsOut[nIndex])//已经out了
        {
            nIndex = (nIndex + 1) % n;
            continue;
        }

        if (nCount % m == 0)
        {
            pIsOut[nIndex] = 1;
            nOutPeople++;
            printf("%d\n", nIndex + 1);
        }

        if (nOutPeople == n)
            break;

        nIndex = (nIndex + 1) % n;
        nCount++;
    }
    free(pIsOut);
    return 0;
}

运行结果:

《约瑟夫环问题(一)(难度:1颗星)》

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/yi_ming_he/article/details/72859577
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞