约瑟夫环的问题
2015-09-19 19:36
267 查看
题目描述:设编号为1,2,3,4,5,6···········n(n>0)的n个人按顺时针方向围坐一圈,给定一个数m,从第一个人开始报数,报到m的那个人出列,不再参与报数,如此循环下去,直到只剩下最后一个人,求出最后一个人的编号。
解题思路:
这个题我采用的数组来做的。算法的描述:
(1)将数组中的n个元素置为1,完成初始化。
(2)初始设置变量m,j,k 。m表示数组中1的个数,即模拟剩下人的数目,m的初始值为n,k也是一个很重要的变量,是每一次循环遍历数组时用来计数那些人要被淘汰,j是用来查找要淘汰的人,每m长度之后,j的值就为0,i是用来循环遍历数组,用来循环查找未淘汰的人。
(3)这个过程主要是用了,一个大的循环,当剩下的人不是1的时候,一直在此循环内,每次循环的时候,要遍历数组,查找要淘汰的人,同时要计算剩下的人数。
代码:
解题思路:
这个题我采用的数组来做的。算法的描述:
(1)将数组中的n个元素置为1,完成初始化。
(2)初始设置变量m,j,k 。m表示数组中1的个数,即模拟剩下人的数目,m的初始值为n,k也是一个很重要的变量,是每一次循环遍历数组时用来计数那些人要被淘汰,j是用来查找要淘汰的人,每m长度之后,j的值就为0,i是用来循环遍历数组,用来循环查找未淘汰的人。
(3)这个过程主要是用了,一个大的循环,当剩下的人不是1的时候,一直在此循环内,每次循环的时候,要遍历数组,查找要淘汰的人,同时要计算剩下的人数。
代码:
#include"stdio.h" #include"stdlib.h" //按照我这么想的,时间复杂度应该是很大的吧 int Josephus(int a,int n) { int i=0,j,k,m; int *b; b=(int *)malloc(sizeof(int)*a); for(i=0;i<a;i++) b[i]=1; k=0; j=0; m=a;//这是一个初始的值喔 while(m!=1) //还是有一个问题木有解决呢?注意这是一个循环的问题你 { k=0; i=0; while(i<a) { if(b[i]==1) { j++; if(j%n==0) //这个j表示很重要喔,模拟报数的时候的情景 { b[i]=0;//表示吧这个给去掉了 k++; j=0; } } i++; }//printf("一直在循环么\n"); m=m-k; } for(i=0;i<a;i++)//按照这种思路剩下的是值为1 if(b[i]==1) { return i+1;;//输出的是这个编号呢这才是编号 } } void main() { int a,b; int i; while(scanf("%d%d",&a,&b)) { i=Josephus(a,b); printf("剩下的人的编号%d\n",i); } }
相关文章推荐
- 链接字符串放在配置文件中
- Java基础知识强化38:StringBuffer类之StringBuffer的添加功能
- POJ-1887
- C++ 空类默认产生的类成员函数
- 老猴子排序
- 树的子结构
- Java基金会——JUnit
- Linux内核笔记——内存管理之slab分配器
- 多态解读
- netstat查看端口指令
- GoldenGate 配置
- 本库主要提供一些类和一些函数来比较不同序列对象
- JAVA学习资源种子
- Unity3d NGUI伪自适应
- 阶梯问题
- 测试要点的提取
- QT对话框中show和exec的区别
- Java事件类型小结
- Oracle学习笔记20150919异常处理表与方案的备份
- View机制深入学习(三) View中的消息传递及InputManagerService