「约瑟夫环java数组」约瑟夫问题数组实现

博主:adminadmin 2022-11-26 07:11:05 59

今天给各位分享约瑟夫环java数组的知识,其中也会对约瑟夫问题数组实现进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java 约瑟夫问题的数组解法

public class 约瑟夫问题 {

  public static void main(String[] args) {

    int[] a = new int[13];

    int start = 0;

    int n = 5;

    while (圈里是否还有人(a)) {

      start = 出圈(start, n, a);

    }

  }

  private static int 出圈(int start, int n, int[] a) {

    int i = start;

    while (n  0) {

      while (a[i] == 1) {

        i = (i + 1) % a.length;

      }

      i = (i + 1) % a.length;

      n--;

    }

    i = (i + a.length - 1) % a.length;

    a[i] = 1;

    System.out.println(i);

    return i;

  }

  private static boolean 圈里是否还有人(int[] a) {

    for (int i = 0; i  a.length; i++) {

      if (a[i] == 0)

        return true;

    }

    return false;

  }

}

n个小孩围成一个圈,从一开始数,数到七的人出列,求依次出列的次序. 求用java写

这个问题是很经典的编程问题,叫约瑟夫环问题,我之前有写程序,所以直接拷给你吧,我初始的n值为13,你也可以自己修改

//YueSeFu.java

public class YueSeFu {

public static void main(String[] args)

{

final int n=13,s=1,m=5;//n为总人数,从第1个人开始报数,报数到m的出圈

int[] p=new int[n];//数组p用于标记已出圈的人

int[] q=new int[n];//数组q存放出队的顺序

int i,j,k,N=0;

k=s-2;//k从1开始数出圈人的下标

for(i=1;i=n;i++)

{

for(j=1;j=m;j++)//从1到m报数,计算出圈人的下标k

{

if(k==n-1)//当出圈人的下标达到末尾时

{

k=0;//出圈人的下标从0开始

}

else

k++;//否则下标+1

if(p[k]==1)//若平p[k]=1,说明下标为k的人已出圈

{

j--;//由于让过已出圈的人,所以j要-1,以保证每次数过m个人

}

}

p[k]=1;//将下标为k的数组元素置1,表示出圈

q[N++]=k+1;//将下标为k的人的编号k+1,存入数组元素q[N]中

}

System.out.println("出圈顺序为:");

for(i=0;in;i++)

{

System.out.print(q[i]+" ");

}

}

}

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

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

队伍    先进先出  FIFO

桟       先进后出  LIFO

本程序明显是队伍!!!

import java.util.* ;

 public class T {

 public static void main(String[] args) {

  ListInteger list = new LinkedListInteger();  

   //模拟15个人,编号是1-15  

   for(int i=1 ; i=15 ; i++) {

     list.add(i);

   }  

   //模拟 叫到7的人出圈  

   show(list , 7);

 } 

 public static void show(ListInteger 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编程实现约瑟夫问题

public class RingTest{

    public static void main(String[] args){

        System.out.println("程序说明如下:");

        System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");

        

        //提示输入总人数

        System.out.println("请输入做这个游戏的总人数:");

        Scanner sca=new Scanner(System.in);

        int m=sca.nextInt();

        //提示输入要出圈的数值

        System.out.println("请输入要出圈的数值:");        

        int n=sca.nextInt();

        System.out.println("按出圈的次序输出序号:");        

        //创建有m个值的数组

        int[] a=new int[m];

        //初始长度,以后出圈一个,长度就减一

        int len=m;

        //给数组赋值

        for(int i=0;ia.length;i++)

            a[i]=i+1;

        //i为元素下表,j代表当前要报的数

        int i=0;

        int j=1;

        while(len0){

            if(a[i%m]0){

                if(j%n==0){//找到要出圈的人,并把圈中人数减一

                    System.out.print(a[i%m]+"  ");

                    a[i%m]=-1;

                    j=1;

                    i++;

                    len--;

                }else{

                    i++;

                    j++;

                }

            }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数

                i++;

            }

        }

    }

}

关于约瑟夫环java数组和约瑟夫问题数组实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。