当前位置:首页 > 编程笔记 > 正文
已解决

只用C语言解决环形链表的约瑟夫问题

来自网友在路上 180880提问 提问时间:2023-11-03 12:07:23阅读次数: 80

最佳答案 问答题库808位专家为你答疑解惑

事情起因与我的老师把答卷发错了,大家都把C++学完了而我刚学到数据结构还在吃奶的阶段,就让我遇到他了,所以这次只靠C语言的知识不用链表来解决,等我学成C++归来再把它做一次

链接:环形链表的约瑟夫问题__牛客网
来源:牛客网
 

据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一种自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,报数到 3 的人就自杀,然后再由下一个人重新报 1,报数到 3 的人再自杀,这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。这就是著名的约瑟夫问题。现在请用单向环形链表得出最终存活的人的编号。

 
输入描述:
一行两个整数 n 和 m, n 表示环形链表的长度, m 表示每次报数到 m 就自杀。

输出描述:
输出最后存活下来的人编号(编号从1开始到n)

示例1

输入

5 2

输出

3

//本题数组表示待死亡人数
//数组中有效数为存活的人
//数组中0则为已自杀int find_zero(int arr[100], int sz)
{int folat = 0;			//设定计数值folat,当计数值在范围内只剩一个有效数字则输出0,负责继续执行for (int i = 0; i < sz; i++){if (arr[i] == 0){folat++;		//设定数组}}if (folat == sz - 1){return 0;	//四个为0返回0}else{return 1;	//四个以下为零返回1}
}
int main()
{int a = 0;scanf("%d", &a);int arr[10000] = { 0 };int sz = 0;for (int i = 0; i < a; i++)		//设置数组{arr[i] = i+1;sz++;}int ret = 0;					//设置自杀数scanf("%d", &ret);int count = -1;				//数字-1对应数组的[]int flaot = ret;			//设定计数值folat,当计数值有效(不为0)则计数while (find_zero(arr, sz))	//如果只剩一个人(一个有效数)则继续执行(自杀){while (flaot)			//计数值flaot,有效自杀(不置为0)才会改变,当计数值为0时,就该死人了{count++;			//每次向后计数while (count > sz - 1)//如果大于人总数则置数组位置零{count = 0;}if (arr[count] != 0)	//死亡倒计时:如果向后计数为有效值(不为零),则计数次-1{flaot--;}}arr[count] = 0;				//死亡flaot = ret;				//死亡倒计时重置}for (int i = 0; i < sz; i++){if (arr[i] == 0){continue;}else{printf("%d", arr[i]);	//读到有效值就输出退出循环break;}}return 0;
}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"只用C语言解决环形链表的约瑟夫问题":http://eshow365.cn/6-31048-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!