【案例】约瑟夫环问题
c语言经典例题古老问题的解决

c语言经典例题古老问题的解决以下是一个经典的C语言例题,它是关于解决一个古老的问题:约瑟夫环问题。
约瑟夫环问题是一个著名的数学和计算机科学问题,其描述如下:有n个人围成一圈,从第k个人开始报数,数到m的人出圈,然后从下一个人开始重新报数,数到m的人再出圈,直到剩下最后一个人。
求最后留下的人在原序列中的编号。
以下是一个使用C语言解决这个问题的示例代码:```cinclude <>include <>int main() {int n, k, m;printf("请输入人数n:");scanf("%d", &n);printf("请输入开始报数的位置k:");scanf("%d", &k);printf("请输入数到m的人出圈的数m:");scanf("%d", &m);int a = (int )malloc(n sizeof(int));for (int i = 0; i < n; i++) {a[i] = i + 1;}int index = k - 1; // 初始位置为第k个人while (n > 1) {for (int i = 0; i < n; i++) {index = (index + m - 1) % n; // 计算下一个要出圈的人的位置printf("出圈的人是:%d\n", a[index]);free(a[index]); // 释放该位置的内存n--; // 人数减1}if (index >= k) { // 如果最后一个出圈的人的位置大于等于k,则交换位置,保证下次从第k个人开始报数int temp = a[index];a[index] = a[0];a[0] = temp;}index = (index + 1) % n; // 重新开始报数}printf("最后留下的人是:%d\n", a[0]); // 最后留下的人即为所求结果 free(a); // 释放整个数组的内存return 0;}```该程序首先要求用户输入人数n、开始报数的位置k和数到m的人出圈的数m,然后创建一个长度为n的数组a,将数组中的元素初始化为1到n 的整数。
约瑟夫环问题(Josephus)

算法设计
Josephus jp=new Josephus(); int a[]=new int[n]; for(int i=0;i<n;i++){ a[i]=i+1; } jp.SortArray(a,n,m,k,g); } public void show(int[]b,int g){ for(int i=b.length-g;i<b.length;i++){ System.out.print(b[i]+" "); } }
• b[c]=a[i]; • a[i]=0; • c++; • if(c==n) break; • } • System.out.print(“最后出列的 3人: "); • this.show(b,g); • } • }
• 1.数据选择: 要求:n<2^15; 1<=k<=n; 2.数据和结果显示:
(3)当然其中还是会存在一些漏洞,需要进 一步的改进。在计算机中是容不得丝毫的 错误的,这也让我们学到了面对科学要持 有严谨的态度,否则必定得不到应该有的 结果。
总人数n 起始号码k 循环数m 最后出列的3人 总人数n 起始号码k 循环数m 最后出列的3人 总人数n 起始号码k 循环数m 最后出列的3人 48 6 15 47 21 46 105 73 4 87 32 21 300 80 12 70 296 198 总人数n 起始号码k 循环数m 68 34 25
输出格式:
T行最后min(n,3)个出列的编号。 结果:6 1 5
问题背景
• 这个问题是以弗拉维奥•约瑟夫斯命名的, 它是1世纪的一名犹太历史学家。他在自己 的日记中写道,他和他的40个战友被罗马 军队包围在洞中。他们讨论是自杀还是被 俘,最终决定自杀,并以抽签的方式决定 谁杀掉谁。约瑟夫斯和另外一个人是最后 两个留下的人。约瑟夫斯说服了那个人, 他们将向罗马军队投降,不再自杀。
(H)实验1 约瑟夫环问题

背景
约瑟夫问题(Josephus Problem)据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
cout<<A[i]<<" "; //输出出去的那个人
for(k=i+1;k<j;k++) //每出去一个人,后面人的序号依次减一
A[k-1]=A[k];
}
cout<<"\n";
return 0;
}
程序运行:
原题:用户输入M,N值,N个人围成一个环,从0号人开始数,数到M,那个人就退出游戏,直到最后一个人求最后一个剩下的人是几号?
问题描述
设编号为1-n的n(n>0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。
基本要求
需要基于线性表的基本操作来实现约瑟夫问题
需要利用数组来实现线性表
输入输出格式
输入格式:n,m
输出格式1:在字符界面上输出这n个数的输出序列
输出格式2:将这n个数的输出序列写入到文件中
约瑟夫环-循环报数问题

约瑟夫环-循环报数问题
约瑟夫游戏的⼤意:30个游客同乘⼀条船,因为严重超载,加上风浪⼤作,危险万分。
因此船长告诉乘客,只有将全船⼀半的旅客投⼊海中,其余⼈才能幸免于难。
⽆奈,⼤家只得同意这种办法,并议定30 个⼈围成⼀圈,由第⼀个⼈数起,依次报数,数到第9⼈,便把他投⼊⼤海中,然后再从他的下⼀个⼈数起,数到第9⼈,再将他投⼊⼤海中,如此循环地进⾏,直到剩下 15 个游客为⽌。
问:哪些位置是将被扔下⼤海的位置?
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m,i,s=0;
cin>>n; //总⼈数
cin>>m; //m个⼀个报数循环(注意参数下标问题)
for(i=2;i<=n;i++)
s=(s+m)%i;
printf("%d", s+1);
return 0;
}。
约瑟夫问题的经典三个例子

约瑟夫问题的经典三个例子以下是 9 条关于约瑟夫问题的经典例子:例子 1:想想看,一群小朋友围成一圈玩游戏,就像我们小时候那样。
这时候说从某个小朋友开始报数,每隔一个人淘汰,最后剩下的那个就是胜利者。
这不就是约瑟夫问题嘛。
就好像在一个神秘的游戏圈子里,大家都紧张又兴奋地等待着命运的裁决。
例子 2:你能想象军队里士兵们站成一圈,然后用这种方式来决定谁去执行特殊任务吗?哎呀呀,那场面肯定很刺激。
每个士兵心里都七上八下的,不知道自己是不是那个“幸运儿”,这和约瑟夫问题如出一辙。
例子 3:假如在一场盛大的聚会中,大家玩这样的游戏,是不是超级有趣?就像一个魔法圈,把大家的注意力都吸引过来了。
每淘汰一个人,大家就会一阵惊呼,这不正是约瑟夫问题带来的独特体验嘛。
例子 4:你看过那种生存挑战节目吗?选手们围成一圈,然后通过类似约瑟夫问题的规则来淘汰人。
哇塞,那紧张的氛围,可不就是在经历一场残酷的竞争,这就是约瑟夫问题在现实中的精彩呈现呀!例子5:好比一群探险家在荒岛上,为了分配重要资源而采取这种方式。
每个人都祈祷自己不要被先淘汰掉,这种感觉是不是很奇妙?这就是约瑟夫问题带来的不确定性啊。
例子6:想象一下公司团建的时候玩这个,大家既期待又担心。
“哎呀,可别先轮到我呀!”“哇,我居然留下来了。
”这种种反应,不就是约瑟夫问题的魅力所在吗?例子 7:学校运动会上,各班学生围成一圈进行比赛,多刺激呀!有人欢喜有人忧,这不就是约瑟夫问题所引发的情绪波澜吗?例子 8:在一个神秘的魔法学院里,学生们也用这种方式来选拔优秀学员。
每一个人都全神贯注,这和约瑟夫问题一样充满了悬念呢!例子9:如果在一个古老的部落中,用约瑟夫问题来决定首领的继承人,那该是多么惊心动魄的场面啊。
大家的心都提到了嗓子眼,。
【待解惑问题(已解决)】约瑟夫(Josephus)环问题

【待解惑问题(已解决)】约瑟夫(Josephus)环问题周末到了,⾸先祝⼤家周末愉快。
可怜我周末都没得休息,继续努⼒:)⼤家该哈⽪的去哈⽪吧。
昨天,其实从前天开始就开始准备约瑟夫环,昨晚就准备开始写,不过想来想去对其数学推导出递推式还是没有想明⽩。
⼤家有空帮忙看看,到底这个递推式是怎么出来的呢?我下⾯会⼀步步将⾃⼰的思考列下来。
多谢多谢。
⼀开始将题⽬和模拟法稍微写⼀下,之后是关于数学⽅法的疑惑,⼤家可以直接略过上⾯的⼀些内容,跳到关键部分。
【题⽬】约瑟夫环问题,每⼀个学习过数据结构或者C语⾔的⼈应该都会遇到过的问题。
不论是在课本的教授内容中,还是在习题⾥⾯,都应该会出现过它的⾝影。
基本的题⽬内容如下:n个⼈围成⼀圈,编号从1到n,报数1,2,3,从编号为1的⼈开始报数,报到3的离开,下⾯的⼈接着从1开始报数,依次下去,写程序求最后剩下来的⼀个⼈编号是⼏。
这⾥题⽬中报数为到3为⽌,其实可以扩展到m。
也就是n个⼈,报到m的⼈出列,同时也可以扩展到以某⼀个⼈为开始,⽽并不是从第1个⼈开始。
【模拟法】⼀般在数据结构课上遇到这个问题的时候,是讲解循环链表的时候,这个题⽬是⽤来检验循环链表学习的结果的。
所以⼀开始我们⽤最“朴素”的⽅法来解决。
⼀般这种⽅法,被称之为模拟法,也就是模拟问题发⽣的过程,直到得到最后的结果,这种解法是最容易想到的,但是⼀般也是效率最低的。
使⽤模拟法来解决,我们可以使⽤循环链表,也可以使⽤数组来模拟循环。
这⾥我们使⽤循环链表,循环链表尽管⽐数组要写得⿇烦,但是思考起来简单直观。
解决问题的核⼼步骤如下:1.建⽴⼀个循环链表,将每个节点进⾏编号2.开始报数,当报到3,删除该节点,然后接着报数3.直到只剩下最后⼀个节点的时候结束,将该节点的值输出Code⽤数组的话,就是要实现循环,也就是当数到n的时候,不会再进⾏n+1,⽽是从1再开始。
这个我们可以⽤取余数来得到。
开始模拟,⾸先第⼀个退出的⼈肯定是m%n,然后需要将之后的位置进⾏调整,(是否可以不进⾏调整?⽤标志位似乎也不是特别好)此时如果还要数组循环的话,就需要与n-1进⾏取余操作。
线性表的应用 约瑟夫环
数据模型 由上述分析可得: 数据模型----线性表 把每个人的编号看成是一个数 据元素,n个编号构成一个线性表
线性表的应用--约瑟夫环 (Josephu环) 【分析问题】 设:M的初值为3;n=6,6个人的密码依次为:
3 , 1, 7, 2, 4, 8
存储结构设计 约瑟夫环问题本身具有循环性质,采用循环单链表
3 , 1, 7, 2, 4, 8
算法步骤
1.工作指针pre和p初始化,计数器count初始化 Pre=head;p=head->next; count=2 2.循环直到p=pre 2.1 如果count=m,则 2.1.1 输出结点p的编号和密码 2.1.2 新的m=当前人的密码 2.1.2 删除结点p 2.1.3 计数器count=1,重新开始计数。 2.2 否则, 2.2.1 工作指针pre和p后移 2.2.2 计数器增1 2.3 链表中只剩下一个结点P,输出结点p后将结点p删除
线性表的应用--约瑟夫环 (Josephu环) 【分析问题】 设:M的初值为3;n=6,6个人的密码依次为:
3 , 1, 7, 2, 4, 8
算法设计
head
1
2
Count=2 p
3
4
5
6
6
pre
为了便于删除操作,从2开始计数
线性表的应用--约瑟夫环 (Josephu环) 【分析问题】 设:M的初值为3;n=6,6个人的密码依次为:
数据模型数据模型线性表把每个人的编号看成是一个数据元素n个编号构成一个线性表线性表把每个人的编号看成是个数线性表的应用约瑟夫环josephu环设
线性表的应用
约瑟夫环 (Josephu环)
趣学算法——约瑟夫环问题(java版)
趣学算法——约瑟夫环问题(java版)1 什么是约瑟夫环问题?约瑟夫,是⼀个古犹太⼈,曾经在⼀次罗马叛乱中担任将军,后来战败,他和朋友及另外39个⼈躲在⼀⼝井⾥,但还是被发现了。
罗马⼈表⽰只要投降就不死,约瑟夫想投降,可是其他⼈坚决不同意。
怎么办呢,他想到⼀个主意:让41个⼈围成⼀个圆圈,从第⼀个⼈开始报数,数到3的那个⼈被旁边的⼈杀死。
这样就可以避免⾃杀了,因为犹太⼈的信仰是禁⽌⾃杀的。
结果⼀群⼈杀来杀去最后只剩下两个了,就是约瑟夫和他朋友,于是两⼈愉快地去投降了。
约瑟夫和朋友站在什么位置才保住了性命呢,这就是我们今天要讲的约瑟夫环问题。
2 问题的重要性这是个BAT常⽤⾯试题,⽽且本质上是⼀个游戏,可以⼴泛应⽤于⽣活中,⼯作⽣活好帮⼿就是它了。
3 约瑟夫环抽象问题这个问题实际在讲:N个⼈围成⼀圈,第⼀个⼈从1开始报数,报M的被杀掉,下⼀个⼈接着从1开始报,循环反复,直到剩下最后⼀个,那最后胜利者的初始位置在哪⾥?模拟流程:假如有5个⼈报数,报到3被杀,情况如下A B C1 D E (初始位置,C第⼀个被杀)D E A2 B (C死后的第⼆次排位,A第⼆个被杀)B D E3 (A死后的第三次排位,E第三个被杀)B4 D (E死后的第四次排位,B第四个被杀)D (D留在了最后,初始位置是4)解决⽅法:1 循环遍历法public static int josephus(int n, int m) {//n个⼈, 0 1 2..n-1int[] people = new int[n];//⼈的索引int index = -1;//报数记录, 1 2 3..mint count = 0;//剩余⼈数初始值为nint remain = n;//为了找到最后⼀个幸存者的位置,假设所有⼈都会被杀while (remain > 0) {index++; //找到报数的⼈if (index == n) { //所有⼈遍历⼀圈后从头遍历index = 0;}if (people[index] == -1) { //如果当前的⼈被杀跳过continue;}count++; //报数if (count == m) {people[index] = -1; //报数到m后杀⼈count = 0; //报数重置remain--; //剩余⼈数递减}}return index;}将41传⼊⽅法后,可得结果为30, 因为是从0开始计数,所以等价于现实世界的第31位。
约瑟夫环问题(Josephus)-文档资料
问题描述
• 已知n(<2^15)个人(以编号1,2,…,n 分别表示)围坐在一圆桌上,从编号为k (1≤ k≤ n)的人开始报数,数到m的那个 人出列,他的下一个人又从1开始报数,数 到m的那个人又出列,依此重复,直到圆桌 周围的人全部出列,依次输出最后三个出 列的序号。
输入格式:
第一行为一个整数T(<2^15)表示测 试次数,接着第二到T+1行分别为n,m和k 的值。 例:2 10 2 3
算法设计
Josephus jp=new Josephus(); int a[]=new int[n]; for(int i=0;i<n;i++){ a[i]=i+1; } jp.SortArray(a,n,m,k,g); } public void show(int[]b,int g){ for(int i=b.length-g;i<b.length;i++){ System.out.print(b[i]+" "); } }
输出格式:
T行最后min(n,3)个出列的编号。 结果:6 1 5
问题背景
• 这个问题是以弗拉维奥•约瑟夫斯命名的, 它是1世纪的一名犹太历史学家。他在自己 的日记中写道,他和他的40个战友被罗马 军队包围在洞中。他们讨论是自杀还是被 俘,最终决定自杀,并以抽签的方式决定 谁杀掉谁。约瑟夫斯和另外一个人是最后 两个留下的人。约瑟夫斯说服了那个人, 他们将向罗马军队投降,不再自杀。
循环队列之约瑟夫环问题
循环队列之约瑟夫环问题约瑟夫问题 约瑟夫环(约瑟夫问题)是⼀个数学的应⽤问题:已知n个⼈(以编号1,2,3...n分别表⽰)围坐在⼀张圆桌周围。
从编号为k的⼈开始报数,数到m的那个⼈出列;他的下⼀个⼈⼜从1开始报数,数到m的那个⼈⼜出列;依此规律重复下去,直到圆桌周围的⼈全部出列。
通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
循环队列求解(链式)#include<stdio.h>#include<stdlib.h>//循环队列//typedef int ElemType;typedef struct QueueNode{int data;struct QueueNode *next;}QueueNode;typedef struct Queue{QueueNode *front;QueueNode *rear;}Queue;void InitQueue(Queue *q){q->front=q->rear=NULL;}void EnQueue(Queue *q , int value){QueueNode *temp=(QueueNode*)malloc(sizeof(QueueNode));temp->data=value;if(q->rear==NULL){temp->next=temp;q->rear=q->front=temp;}else{temp->next=q->rear->next;q->rear->next=temp;q->rear=temp;}}//enter a element from the tailvoid DeQueue(Queue *q, int *value){QueueNode *temp=(QueueNode*)malloc(sizeof(QueueNode)); if(q->rear==NULL){return;}// It's nullelse if(q->rear->next==q->rear){*value=q->front->data;free(q->rear);q->rear=q->front=NULL;}//It just has one nodeelse{*value=q->front->data;temp=q->front;q->front=temp->next;q->rear->next=q->front;}//more one nodefree(temp);}//delete a element from the headint main(){Queue *q=(Queue*)malloc(sizeof(Queue));int i,m,n,count,temp;printf("请输⼊⼈数n和循环要报的数m(两数之间留个空格)\n"); scanf("%d%d",&n,&m);for(i=1;i<=n;i++)EnQueue(q,i);printf("出圈序列:\n");while(q->front){ count=1;while(count<m){q->front=q->front->next;q->rear=q->rear->next;count++;}count=1;DeQueue(q,&temp);printf("%d ",temp);}putchar('\n');}简单解法#include <stdio.h>int josephus(int n, int m) {if(n == 1) {return0;}else {return (josephus(n-1, m) + m) % n;}}int main() {int n, m;while (scanf("%d", &n) == 1) {if (!n) {break;}scanf("%d", &m);int result = josephus(n, m);printf("%d\n", result+1);}return0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int main()
{
Josephus man[N]; init_Josephus(man,N);
baoshu(man, N, M) ;
printf("\n按座位顺序排列:\n"); display_Josephus(man,N); sort_by_count(man,N); printf("\n按出列顺序排列:\n"); display_Josephus(man,N); getch(); return 0;
模拟循环报数
i=0; while(counter<=N) //在N个人中模拟循环报数 { do{ pos=(pos+1) % N; //求余,进行环状处理 if( man[pos].count==0) //若编号pos还未出列 i++; //报数 if(i==M) //报数M的人 { i=0; //初始化记数器,又从1开始报数 break; } }while(1); man[pos].count =counter; //保存出列序号 counter++; }
修改
void void void void baoshu(Josephus *, int n, init_Josephus(Josephus *, display_Josephus(Josephus sort_by_count(Josephus *, int m); int n); *, int n); int n);
方法1:使用一维数组
• 用一个一维整型数组保存约瑟夫环
• 数组元素的序号(下标)表示人员的座位序号
• 数组元素的值表示出列的序号 如,man[0]=14 表示排在第1个位置的人将是第14个出列的人
#define N 41 #define M 3 int int int int
//总人数 //数到3出列
// 模拟报数 void baoshu(Josephus man[N], int n, int m) { int counter=1; //出列记数器 int i=0; //报数记数器 int pos=-1; //位置记数器 while(counter<=n) //在N个人中模拟循环报数 { do{ pos=(pos+1) % n; //求余,进行环状处理 if(man[pos].count==0) //若编号pos还未出列 i++; //报数 if(i==m) //报数M的人 { i=0; //初始化记数器,又从1开始报数 break; } }while(1); man[pos].count=counter; //保存出列序号 counter++; } }析
什么是约瑟夫环问题
• 传说,著名犹大历史学家Josphus曾讲过一个故事: 在罗马人占领乔塔帕特后,40个犹太人与Josphus躲到 一个洞中。40个犹大人决定宁愿死也不要被敌人逮到,于是 决定了一个自杀方式:41个人排成一个圆圈,由第1个人开 始报数,每报数到3,该人就必须自杀,然后再由下一个人 重新报数,直到所有人都自杀身亡为止。
// 初始化 void init_Josephus(Josephus man[N], int n) { int i; for(i=0;i<n;i++) { man[i].num=i+1; gets(man[i].name); man[i].count=0; //保存出列的序号,为0表示未出列 } } void init_Josephus( Josephus *p, int n) 修改 { int i; for(i=0;i<n;i++,p++) { p->num = i+1; gets(p->name); p->count = 0; //保存出列的序号,为0表示未出列 } }
}
方法3:结构体指针
结构体指针作为各函数的形参
void void void void baoshu(Josephus man[], int n, int m); init_Josephus(Josephus man[], int n); display_Josephus(Josephus man[], int n); sort_by_count(Josephus man[], int n);
按出列顺序排序
void sort_by_count(Josephus man[], int n) { int i,j; Josephus t; for(i=0; i<n-1; i++) { for(j=i+1; j<n; j++) { if(man[i].count > man[j].count ) { t=man[i],man[i]=man[j],man[j]=t; } } } }
各项功能分别用函数实现
// 模拟报数 void baoshu(Josephus man[], int n, int m);
// 初始化 void init_Josephus(Josephus man[], int n);
// 输出结构体数组 void display_Josephus(Josephus man[], int n); // 按出列顺序排序 void sort_by_count(Josephus man[], int n);
模拟循环报数
man[N]={0}; //保存出列的序号,为0表示未出列 counter=1; //出列记数器 i=0; //报数记数器 pos=-1; //位置记数器
while(counter<=N) //在N个人中模拟循环报数 { do{ pos=(pos+1) % N; //求余,进行环状处理 if(man[pos]==0) //若编号pos还未出列 i++; //报数 if(i==M) //报数M的人 { i=0; //初始化记数器,又从1开始报数 break; } }while(1); man[pos]=counter; //保存出列序号 counter++; }
• 排名:根据选手的最后得分排出名次, • 查询:可查询选手信息(按姓名、出场顺序编号或最后名次 等)功能
• 具体功能设计不限于以上。
方法2:结构体数组
如果,还要知道参加游戏人的名字,怎么办? • 座位号:结构体成员(整型) 或 数组的下标 • 名字:结构体成员(字符串) • 出列序号:结构体成员(整型)
// 定义结构体类型 typedef struct { int num; // 座位序号 char name[20]; int count; // 出列序号 }Josephus; // 定义结构体数组 Josephus man[N]; // 结构体数组元素的初始化 for(i=0;i<N;i++) { man[i].num=i+1; gets(man[i].name); man[i].count=0; }
然而,Josphus并不想遵从自杀,于是他先假装同意该 方案,然后坐到大家围成圆圈的第31个位置,逃过了这场死 亡游戏。
问:如何确定坐在哪个位置上可以逃脱呢?
问题分析
• 将41人排成一个圆圈,并编好序号,如图所示(内圈是座 位序号,外圈是自杀顺序(即,每个报到3的顺序)。
23 14 36 1 38 29 13 15 1 2 3 40 41 4 33 2 39 5 38 6 22 24 37 7 30 12 8 36 9 3 39 35 10 16 28 34 11 34 11 33 12 4 21 32 13 25 31 14 30 17 10 15 29 5 32 16 28 20 40 17 27 26 18 9 19 31 25 20 24 23 27 21 22 6 35 18 8 19 37 7 26
// 初始化 void init_Josephus(Josephus man[N], int n) { int i; for(i=0;i<n;i++) { man[i].num=i+1; gets(man[i].name); man[i].count=0; //保存出列的序号,为0表示未出列 } } // 输出结构体数组 void display_Josephus(Josephus man[], int n) { int i; printf("约瑟夫排列(最初位置--姓名--约瑟夫环位置):\n"); for(i=0;i<N;i++) { printf("%d--%s--%d\n",man[i].num ,man[i].name,man[i].count ); } }
大作业:歌手大奖赛竞赛系统
已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手 评分(最高100分,最低0分)。 要求编程实现: • 出场顺序:随机从一位选手编号开始,按约瑟夫环的方式,3 人循环报数,决定选手的出场顺序。
• 评委评分:去掉1个最高分和1个最低分后,取平均分作为该 选手的最后得分。