c与c++语言 求解Josephus问题

求解Josephus问题:设有n个数构成一个环链,要求从第k个数开始数数,数到m的那个数被弹出,然后从该数的下一个数重新数数,数到m的那个数又被弹出,如此重复,直到所有的... 求解Josephus问题:设有n个数构成一个环链,要求从第k个数开始数数,数到m的那个数被弹出,然后从该数的下一个数重新数数,数到m的那个数又被弹出,如此重复,直到所有的数均被弹出为止。输出这些数弹出的序列。
如上 谢谢
展开
 我来答
liouyi250
2017-12-10 · TA获得超过314个赞
知道小有建树答主
回答量:375
采纳率:60%
帮助的人:65.1万
展开全部
#include <stdio.h>
#include <stdlib.h>
pNode* createCircleList(int n){
    pNode* head=(pNode*)malloc(sizeof(pNode));
    head->next=NULL;
    head->data=0;
    pNode* node=head;
    for(int i=1;i<n-1;i++){
        pNode* p=(pNode*)malloc(sizeof(pNode));
        p->data=i;
        p->next=NULL;
        node->next=p;
        node=node->next;
    }
    pNode* p=(pNode*)malloc(sizeof(pNode));
    p->data=n;
    p->next=head;
    node->next=p;
    return head;
}

pNode* find(pNode* head,int n){
    pNode* p=head;
    for(int i=1;i<n;i++)
        p=p->next;
    return p;
}

void remove(pNode* node,int m,int count){
    pNode* p=node;
    for(int i=0;i<count;i++){
        printf("%d ",p);
        p=p->next;
    }
    printf("\n");
    p=node;
    if(count!=1){
        for(int i=1;i<m-1;i++)
            p=p->next;
        pNode* pDel=p->next;
        p->next=pDel->next;
        pDel=NULL;
        free(pDel);
        remove(p->next,m,count-1);
    }else{
        node->next=NULL;
        free(node->next);
        printf("%d\n",p->data);
    }
}

int main()
{
    
    int n,k,m;
    scanf("%d %d %d",&n,&k,&m);
    pNode* head=createCircleList(n);
    printf("%d\n",head);
    pNode* start=find(head,k);
    printf("%d\n",start);
    remove(start,m,n);
}

输出的最后一个信息是数据,其他数据是为了方便理解和查看错误

Oo没有蜡oO
2011-03-13 · TA获得超过3036个赞
知道小有建树答主
回答量:1602
采纳率:0%
帮助的人:1293万
展开全部
这个用链表来实现非常简单,先创建一个环状的链表,首尾相连的,实现非常简单,手机回答的,就不贴程序了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
物语杂谈
2011-03-13 · 超过28用户采纳过TA的回答
知道答主
回答量:106
采纳率:0%
帮助的人:46.8万
展开全部
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 int didSolve(int n,int m) {
5 int p[50];
6 memset(p,0,sizeof(int)*50);
7
8 int i = 0;
9 int c = 0;
10 int r = n;
11 while(r != 1) {
12 c = 0;
13 while(c != m) {
14 if (p[i] == 0) {
15 printf("p(%d) say:%d\n",i+1,c);
16 c ++;
17 }
18 if (c == m) {
19 p[i] = 1;
20 printf("%d \n",i + 1);
21 }
22 i ++;
23 if (i == n) {
24 i = 0;
25 }
26 }
27 r --;
28 }
29 return 0;
30 }
31
32 int deal() {
33 int n=0,m=0;
34 scanf("%d %d",&n,&m);
35 didSolve(n,m);
36 return 0;
37 }
38 int main(int argc,char *argv[]) {
39 int testCase = 0;
40 scanf("%d",&testCase);
41 while(testCase --) {
42 deal();
43 }
44 return 0;
45 }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式