关于约瑟夫_Joesphus问题(C语言数组解决)
来源:互联网 发布:编程熟练 编辑:程序博客网 时间:2024/06/03 21:06
再来回顾一下Joesphus问题:
约瑟夫问题:
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
那么将上述问题一般化,我们能得到:N个人围成一圈,并从1-N编号,从第一个开始报数,第M个将被杀掉。求依次被杀掉的人员编号。
用C语言来解决上述问题,以N=17,M=3为例,我们可以构建一个数组int people[N] 并将其所有元素初始化为-1,然后按照游戏规则将每人被杀掉的顺序赋给对应元素的值,最后按照被杀顺序来依次输出每个元素的下标+1即可。
#include<stdio.h>#define N 17#define C 3int main(void){ int people[N]; int i,j,index; int count; //每个元素初始化为-1 for(i=0;i<N;i++) people[i]=-1; i=0,index=0,count=0; //约瑟夫式计数 while(i<N) //确保给17人编号 { if(people[index]==-1) count++; //跳过已经计数的元素 if(count==C) { people[index]=i; //编号 count=0; //count初始化为0后重新计数 i++; //编号成功后自增 } /*索引循环,到达N后归0*/ index++; if(index==N) index=0; } //依次输出 for(i=0;i<N;i++) for(j=0;j<N;j++) if(people[j]==i) printf("%d ",j+1); return 0;}
阅读全文
0 0
- 关于约瑟夫_Joesphus问题(C语言数组解决)
- 【c语言】使用数组解决 约瑟夫环问题
- 约瑟夫问题(C语言数组实现)
- C语言解决约瑟夫问题算法
- c语言 递归解决约瑟夫问题
- The Second Blog -数组实现约瑟夫问题-C语言
- 约瑟夫环问题(c语言数组实现)
- 数组解决约瑟夫环问题
- 数组解决约瑟夫环问题
- C语言求解约瑟夫问题
- 约瑟夫问题 C语言代码
- C语言/约瑟夫环问题
- 【C语言】 约瑟夫环问题
- 数据结构 C语言 约瑟夫问题
- 使用数组解决约瑟夫环问题
- 用数组法解决约瑟夫问题
- 利用数组解决约瑟夫环问题
- 约瑟夫问题(php数组方式解决)
- Java对象实例化过程
- 爬虫 requests库的cookie 和session
- for_each各种情况下的函数对象使用方法
- 切换npm源为淘宝镜像(cnpm)
- list根据某个字段去重方式
- 关于约瑟夫_Joesphus问题(C语言数组解决)
- c++中头文件与实现文件的关系
- 数据结构与算法概念解析
- 冒泡排序
- 浅谈媒体查询
- spring-mvc拦截器+注解 解决重复请求
- 使用label标签,修改checkbox默认样式
- in 和 exists 区别,not in和not exists区别
- mina服务端检测客户端心跳实例