C语言解决约瑟夫环问题

小微 科技C语言解决约瑟夫环问题已关闭评论105字数 1940阅读模式
摘要约瑟夫问题:在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数...

约瑟夫问题:在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家抉择宁愿自杀也不要被敌人抓到,于是肯定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每一报数到第3人该人就必需自杀,然后再由下一个从新报数,直到所有人都自杀身亡为止。但是约瑟夫以及他的朋友其实不想死去,那么他应当怎么样支配他以及他的朋友的位置,才能逃脱这场死亡游戏呢?

由此衍生出了约瑟夫环问题文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

编号为 1,2,3,…,n 的 n 个人围坐一圈,任选一个正整数 m 作为报数上限值,从第一个人开始按顺时针方向报数,报数到 m 时休止,报数为 m 的人出列。从出列人的顺时针方向的下一个人开始又从 1 从新报数,如斯下去,直到所有人都全体出列为止。文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

约瑟夫环问题文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

用C语言数组解决约瑟夫环问题文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

typedef struct Node{ int Num; struct Node *next;}JoseNode, *PNode, *HNode;文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

完全代码文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

#include <stdio.h>#include <malloc.h>/*构建结构体*/typedef struct Node{ int Num; struct Node *next;}JoseNode, *PNode, *HNode;/**********初始化循环单链表*********/int JoseInit(HNode *h){ if (!h) { printf(\"初始化链表过错!\\n\"); return 0; } (*h)->next = (*h);//循环单链表 return 1;}/*************单链表插入操作**********/int JoseInsert(JoseNode *h, int pos, int x){ PNode p=h,q; int i=1; if (pos == 1)/*尾插法*/ { p->Num = x; p->next = p; return 1; } while(i<pos-1) { p=p->next; i++; } q=(PNode)malloc(sizeof(JoseNode)); q->Num=x; q->next=p->next; p->next=q; return 1;}/*遍历*/void TraverseList(HNode h, int M){ int i = 0; PNode p = h; printf(\"介入的人的编号为:\\n\"); while (i<M) { printf(\"%d\\t\", p->Num); p = p->next; i++; } printf(\"\\n\");}/**************出局函数****************/int JoseDelete(HNode h, int M, int k){ int i; PNode p=h,q; while(M>1) { for(i=1;i<k-1;i++) { p=p->next; } q=p->next; p->next=q->next; printf(\"出局的人为:%d号\\n\",q->Num); free(q); p=p->next; M--; } printf(\"***************获胜者为:%d号***************\",p->Num); return 1;}/***************************************/int main(){ int i;//计数器 int N;//介入的人数 int k;//报数密码 printf(\"请输入介入人数:\"); scanf(\"%d\",&N); printf(\"请输入出局密码:\"); scanf(\"%d\",&k);/**************得到头结点****************/ HNode h = ((HNode)malloc(sizeof(JoseNode)));/***************初始化单链表************/ JoseInit(&h);/******将编号插入到循环单链表中******/ for (i = 1; i <=N; i++) { JoseInsert(h, i, i); }/**************遍历单链表***************/ TraverseList(h,N);/***************出局函数************/ if(k > 1) JoseDelete(h, N, k); else { for(i = 1; i < N; i++) printf(\"出局的人为:%d号\\n\",i); printf(\"***************获胜者为:%d号***************\",N); } printf(\"\\n\"); printf(\"\\n\"); return 0;}文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

以上就是微观生活(93wg.com)关于“C语言解决约瑟夫环问题”的详细内容,希望对大家有所帮助!文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html 文章源自微观生活(93wg.com)微观生活-https://93wg.com/17589.html

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/17589.html