约瑟夫环问题

Posted lqx0123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫环问题相关的知识,希望对你有一定的参考价值。

7-3 约瑟夫环问题-hebust

约瑟夫环是一个数学的应用问题:已知n个人(以编号a,b,c...分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

输入格式:
固定为2行,第一行为m,第二行为n个人的名称列表,用英文字母代表,元素直接使用英文逗号 , 分开

输出格式:
一行,为出列元素序列,元素之间使用英文逗号 , 分开【注意:末尾元素后没有逗号】

输入样例:
在这里给出一组输入。例如:

3
a,b,c,d,e,f,g

输出样例:
在这里给出相应的输出。例如:

c,f,b,g,e,a,d

实验代码

/*这题写了3个多小时,太难了。主要是着逗号有点烦,后来我就想直接把将元素存入另一个数组中,去掉逗号。
这样就好办多了,然后就遍历,判断,求余等。

#include<stdio.h>
#define SIZE 100
int main()
{
    int n;
    char str1[SIZE] = { 0 };  //输入元素
    char str[SIZE] = { 0 };  //去逗号,存元素
    int index = 0;  //从第一个元素遍历
    int step = 1;  //第一个元素也算一步
    int count = 0;  //出列元素个数
    char outs[SIZE] = { '' };  //存已被标记过的元素
    int flag[SIZE] = { 0 };  //标记出列的元素
    

    scanf("%d
", &n);

    gets(str1);
    int len1 = strlen(str1);   //输入元素的长度

    //将str1数组中的元素去逗号存入str
    int j = 0;
    for (int i = 0; i < len1; i++)
    {
        if (str1[i] != ',')
        {
            str[j] = str1[i];
            j++;
        }
    }
    int len = j;  //去逗号之后数组的长度

    index = 0;  //从第一个元素遍历
    step = 1;  //第一个元素也算一步
    while (count < len)  //标记元素是否等于数组长度
    {
        if (step == n)   //判断元素是否出列
        {
            outs[count] = str[index];  //将元素存入outs数组里
            count++;  //出列元素+1
            step = 0;  //步数归零,因为下标是已出列的元素
            flag[index] = 1;  //标记
        }

        index = (++index) % len;  //重复遍历,求余
        if (flag[index] == 0)  //如果数组元素下标没有被标记,步数+1
        {
            step++;
        }
    }

    //输出
    printf("%c", outs[0]);
    for (count = 1; count < len; count++)
    {
        printf(",%c", outs[count]);
    }

    return 0;
}

以上是关于约瑟夫环问题的主要内容,如果未能解决你的问题,请参考以下文章

约瑟夫环问题

约瑟夫环问题

用单向循环链表实现约瑟夫环问题

约瑟夫环问题

约瑟夫环问题

java中约瑟夫环代码实现