关于约瑟夫环问题,用java 编写程序,输出n个人出圈的顺序,书上的程序代码如下,但是有几点我搞不明白

求大神相助~~
public class App_5
{
public static void main(String[] args)
{
final int N=13,S=3,M=5; //N为总人数,从第S个人开始报数,报数到M 的为出圈
int[] p=new int[N]; //数组p用来标识已出圈的人
int[] q=new int[N]; //数组q用于存放出圈顺序
int i,j,k,n=0; //n=?
k=S-2; //k从1开始数出圈人你的下标??【什么意思,搞不明白】
for(i=1;i<=N;i++)
{
for(j=1;j<=M;j++) //从1到M报数,计算 出圈人 的下标 (怎么计算??)
{
if(k==N-1) //当出圈人的下标达到末尾时
k=0; //出圈人的下标从0开始 ??【为什么?】
else
k++; //否则下标+1
if(p[k]==1) //若p[k]=1,说明下标为k的人已出圈【为什么,什么意思??】
j--;
}
p[k]=1; //将下标为k的数组元素置1,表示其出圈 【??】
q[n++]=k+1;
}
//将上行改为System.out.print((k+1)+" ");后可去掉下面三行输出语句
System.out.println("出队顺序为:");
for(i=0;i<N;i++)
System.out.print(q[i]+" "); //q[0]=??
}
}

你这个好麻烦啊, 理解 队列 和 桟 的区别

队伍    先进先出  FIFO  

桟       先进后出  LIFO

本程序明显是队伍!!!

import java.util.* ;
 public class T {
 public static void main(String[] args) {
  List<Integer> list = new LinkedList<Integer>();  
   //模拟15个人,编号是1-15  
   for(int i=1 ; i<=15 ; i++) {
     list.add(i);
   }  
   //模拟 叫到7的人出圈  
   show(list , 7);
 } 
 public static void show(List<Integer> list  , int n){
   int i = 1 ;//每次报的数字 
   int count = 1 ;//记录第几次出圈 
   while(true){
    //当list长度为1的时候代表就剩下1个人 
    if(list.size()==1){
       System.out.println("第"+count+++"次是"+list.get(0));
      return ;
   }
   //每次获取队里第一个人 
   int value = list.get(0);
    //报完数后移开该人 
   list.remove(0);
   //如果报数的人报的数字为n ,则打印 
   if(i == n) {
    i = 1 ;
    System.out.println("第"+count+++"次是"+value);
   }else {
    //如果报数的人报的数字不是n ,将该人排到队伍的后面,以便下次继续叫号 
    list.add(value);
    //产生下次报数的数字 
    i++ ;
   }
  }
 }
}

温馨提示:内容为网友见解,仅供参考
无其他回答

关于约瑟夫环问题,用java 编写程序,输出n个人出圈的顺序,书上的程序代...
桟 先进后出 LIFO 本程序明显是队伍!!!import java.util.* ; public class T { public static void main(String[] args) { List<Integer> list = new LinkedList<Integer>(); \/\/模拟15个人,编号是1-15 for(int i=1 ; i<=15 ; i++) { list.add(i); } \/...

如何用JAVA实现约瑟夫环问题?急!
Link p,q,L;int i,m,n,mima;printf("请输入人数和初始密码:");scanf("%d%d",&n,&m);if(n<=0 || m<=0)return;L = Init();i=1;while(i<=n){ printf("请输入第 %d 个人的密码:",i);scanf("%d",&mima);if(mima <= 0)continue;Insert(L, mima, i);i++;} i = 1...

约瑟夫问题:n个人围成一圈,从第1个人开始数数,数到3的人出圈,输出出圈...
pPre->pNext=pCur->pNext;cout<<pCur->num<<"出圈!"<<endl;delete pCur;pCur = pPre->pNext;iCount=0;ExitNum++;if(NULL==pCur){ pCur=pHead;continue;} } if(!bIsOut){ pPre = pCur;pCur=pCur->pNext;if(NULL==pCur)pCur=pHead;} else { bIsOut=false;continue;} } ...

用C++编写约瑟夫环的代码,也就是出圈问题,n个人,数到k出圈,接着从1开 ...
include <iostream> using namespace std; int main() { int n,s,m; cout<<"please input the valuse of n,m,s"<<endl; cin>>n>>m>>s; if(n<=0||s<=0||m<=0) { cout<<"error"<<endl; } int i,j,k,temp;\/\/k为次数 int A[100]; for(i=0;i<n;i+...

计算机三级考试约瑟夫环出圈求解释 wait on line!
现要求按出圈次序,给出这n个人的顺序表p。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈的顺序输出到OUT.DAT文件中。注意:第1个出圈的编号存放在p[0]中,第2个出圈的编号存放在p[1]中,直至第n个出圈的编号存放在p[n-1]中。设 n = 100, s = 1, m = 10进行编程...

【生活处处皆算法】巧用约瑟夫环
约瑟夫环 (约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出圈;他的下一个人又从1开始报数,数到m的那个人又出圈;依次规律重复下去,直到剩余最后一个胜利者。例如:有10个人围成一圈进行此游戏,每个...

matlab实现约瑟夫环问题!!急!!
num=1:n;%用1:n表示n个人 f=zeros(1,n);a=1;%表示总共需要出去n个人 j=1;%用来表示数m次 ind=0;%对应num中的下标,即某个人 while a<=n while j<=m ind=ind+1;if ind>length(num)ind=1;end j=j+1;end f(a)=num(ind);%把要剔除的人存在f中 num(ind)=[]%剔除这个人 ...

C++ 约瑟夫环问题
1. 出圈游戏一 2. 出圈游戏二 3. 输出出圈游戏一结果 4. 输出出圈游戏二结果 5. 退出 选择1,2时分别进行出圈游戏,且将结果保存在文件中,选择3,4时,在屏幕上输出相应结果 include <stdio.h> include <malloc.h> struct stu { int num;struct stu *next;};int m,n;struct stu *p,*q...

我的孩子今年小学五年级,要参加Turbo Pascal 7.0小学程序设计竞赛
31. 输入5数,倒序输出.32. 不用条件语句计算各分数段人数.33. 约瑟夫环问题,max人围成一圈,每数到jump,则该人出圈,直至所有人全部出圈为止. 试求出圈顺序.34. 约瑟夫环问题: 编号为 1,2,3,...,N 的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数).从指定编号为 1 的人开始,按顺时针方向自...

pascal 的初级题
31. 输入5数,倒序输出.32. 不用条件语句计算各分数段人数.33. 约瑟夫环问题,max人围成一圈,每数到jump,则该人出圈,直至所有人全部出圈为止. 试求出圈顺序.34. 约瑟夫环问题: 编号为 1,2,3,...,N 的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数).从指定编号为 1 的人开始,按顺时针方向自...

相似回答