约瑟夫环
1.为题概述:
已知有n个人(分别编号为1,2,3…n)围坐成一圈,从第一个人开始报数,报到数m的人出圈;再从下一个人开始重新报数,报到m的人出圈;直至剩下最后一个人的时候游戏结束。输出剩下的人的原始编号。
2.实现的方法
-
循环链表表示
-
数组标志位表示
-
数组链接方式表示(静态链表)
//约瑟夫环(静态链表); void ChangeMonkey (){ int i,n,m; //n为猴子个数,报数到m退出; int count,number,pos,prior; //模拟链表指针; printf("请输入猴子个数,报数个数"); scanf("%d %d",&n,&m); if(m==0&&n==0){ return ; } int monkey[301] ={0}; //存储猴子下一个位置; //monkey数组存储的是链接关系(相当于指针),数组的下标表示的为第几个猴子,因此最终的结果加一 for (i=0;i<n-1;i++){ monkey[i] = i+1; } monkey[i] = 0; //下标为n-1的元素的下一个表示0,形成循环链表; //静态链表初始化; count = 1; //代表当前报数,初始为 1 (第一个猴子) pos = 0; //头指针; prior = n-1; //尾指针; while (pos!=prior){ if (count!=m){