约瑟夫环java

来源:互联网 发布:windows内核原理与实现 编辑:程序博客网 时间:2024/05/29 14:48

/*

问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,抱m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数;如此下去,直到所有人全部出列为止。要求用JAVA设计一个程序模拟此过程,并给出出列人的编号序列。

测试数据

初始报数上限值m = 20

n = 7,七个人的密码依次为3,1,7,2,4,8,4

*/

import javax.swing.*;

public class Yuesefu
{
public static void main(String[] args)
{
  JOptionPane input =new JOptionPane();
  int n=Integer.parseInt(input.showInputDialog("请输入总人数:"));
  Ren a1=new Ren(1,Integer.parseInt(input.showInputDialog("请输入第1个人的密码")));
  Ren index=a1;// j 指向人
  for(int i=2;i<=n;i++)//初始化每个人
  {
   index.next=new Ren(i,Integer.parseInt(input.showInputDialog("请输入第"+i+"个人的密码")));
   index=index.next;
  }
  index.next=a1;
  int m=Integer.parseInt(input.showInputDialog("请输入初始密码:"));
  for(int i=0;i<7;i++)
  {
   for(int k=0;k<m-1;k++)//轮转
   {
    index=index.next;
   }
   System.out.println("第"+index.next.flag+"个人出局");
   input.showMessageDialog(null,"第"+index.next.flag+"个人出局");
   m=index.next.mima;//可以实现剔除后转换为此人拥有的密码.
   index.next=index.next.next;
  }
}
public static class Ren//定义人的链表
{
  private int flag;//序号
  private Ren next;//指针
  private int mima;
  public Ren(int n,int m)
  {
   flag=n;
   mima=m;
  }
}
}

/*

数小孩的题,相信大家可能在学校的时候都作过,我上学的时候老师也讲过,可就是没好好听,一看见这道题的时候那叫一个后悔啊。
    假设n个小孩围成一圈,每次数第m个小孩,该小孩被踢出来,请问当这帮小,王,八,蛋只剩下一个人的时候是第几个人。(比如m=3,第一次数到第3个,第二次从第4个开始往下数,转圈数)写一个方法来实现。

*/

import javax.swing.*;

//改自上一个方法.

public class Yuesefu
{
public static void main(String[] args)
{
  JOptionPane input =new JOptionPane();
  int n=Integer.parseInt(input.showInputDialog("请输入总人数:"));
  Ren a1=new Ren(1,Integer.parseInt(input.showInputDialog("请输入第1个人的密码")));
  Ren index=a1;// j 指向人
  for(int i=2;i<=n;i++)//初始化每个人
  {
   index.next=new Ren(i,Integer.parseInt(input.showInputDialog("请输入第"+i+"个人的密码")));
   index=index.next;
  }
  index.next=a1;
  int m=Integer.parseInt(input.showInputDialog("请输入初始密码:"));
  for(int i=0;i<7;i++)
  {
   for(int k=0;k<m-1;k++)//轮转
   {
    index=index.next;
   }
   System.out.println("第"+index.next.flag+"个人出局");
   input.showMessageDialog(null,"第"+index.next.flag+"个人出局");
   m=index.next.mima;//可以实现剔除后转换为此人拥有的密码.
   index.next=index.next.next;
  }
}
public static class Ren//定义人的链表
{
  private int flag;//序号
  private Ren next;//指针
  private int mima;
  public Ren(int n,int m)
  {
   flag=n;
   mima=m;
  }
}
}