C++单链表做约瑟夫环

有M个人围坐成一圈,编号依次从1开始递增,现从编号为1的人开始报数,报到N的人出列,然后再从下一个人开始重新报数,报到N的人出列。重复这一过程直到所有人出列,求出列次序... 有M个人围坐成一圈,编号依次从1开始递增,现从编号为1的人开始报数,报到N的人出列,然后再从下一个人开始重新报数,报到N的人出列。重复这一过程直到所有人出列,求出列次序 展开
 我来答
硪丨暧恋
2016-10-11 · TA获得超过8980个赞
知道大有可为答主
回答量:5336
采纳率:93%
帮助的人:2193万
展开全部
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int a[1000000];

struct LNode{
    int num;
    LNode *next;
};
LNode *p, *r, *list;

/*利用单向循环链表实现*/
void joseph(int n, int m){//n:总人数;m:报数上限
    printf("\n%d个人报数,上限为%d \n", n, m);
    int i;
    //创建链表
    for (i = 1; i <= n; i++){
        p = new LNode;
        p->num = i;
        if (list == NULL)
            list = p;
        else
            r->next = p;
        r = p;
    }

    p->next = list;//使链表循环
    p = list;//p指向头结点
    r = p;

    //x循环删除队列中的结点,即出列
    printf("出列者序列:");
    while (p->next != p){
        for (i = 1; i<m; i++){
            r = p;
            p = p->next;
        }
        r->next = p->next;
        printf("%d ", p->num);
        free(p);
        p = r->next;
    }
    printf("\n最后留下的人是:%d\n", p->num);
}

int main(){
    for (int m, n; cin >> m >> n;)
        joseph(m, n);
    return 0;
}
/*
* n的初值为10,m为2,则出列顺序为 2 4 6 8 10 3 7 1 9,最后留下者是 5.
* n的初值为20,m为5,则出列顺序为 5 10 15 20 6 12 18 4 13 1 9 19 11 3 17 16 2 8 14,最后留下者是 7.
*/
ZESTRON
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸... 点击进入详情页
本回答由ZESTRON提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式