已解决
只用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%的人还看了
相似问题
- 深度学习之基于YoloV5-Pose的人体姿态检测可视化系统
- 【毕业论文】基于MATLAB的人脸识别算法的研究
- 怎么通过联表合并表格的后查找不同职务职称的人数(python自动化办公,表格合并,同时查询不同类别情况下的个数)
- 基于yolov2网络的人脸识别系统matlab仿真,包括识别正脸,侧脸等
- AI:62-基于深度学习的人体CT影像肺癌的识别与分类
- 怎样提取视频提取的人声或伴奏?
- 基于深度学习的人脸表情识别 计算机竞赛
- 中国人民大学与加拿大女王大学金融硕士——在职读研,演绎精彩的人生
- 基于Java的人事考勤签到管理系统设计与实现(源码+lw+部署文档+讲解等)
- 使用python-opencv检测图片中的人像
猜你感兴趣
版权申明
本文"只用C语言解决环形链表的约瑟夫问题":http://eshow365.cn/6-31048-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 跨境电商商城源码(支持多种支付方式+多语言+多货币+快速部署)
- 下一篇: HTML样式CSS、图像