Java实现约瑟夫环
2015-10-16 07:08
471 查看
问题描述:
约瑟夫环问题是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到只剩1人。
(1)定义一个Person类,该类有成员属性name、age,成员方法toString,将name和age属性的值作为字符串返回,为该类编写构造方法。
(2)使用泛型定义一个顺序表类OrderList,参考上课所讲内容及数据结构相关要求完成该类。
(3)定义测试类,在改类中创建n个Person类的对象并插入顺序表中,从第1个人开始数数到第m个人时删除,然后接着从下一个人开始数,数到第m个人时删除,以此类推,最后剩下一个人时即为幸存者。(数数时,如果到了末尾则下一个是表头的元素)
Person.java
public class Person {
String name;
int age;
public Person(){}
public Person(String S,int a)
{this.name=S;
this.age=a;}
public String toString()
{return "姓名: "+name+"年龄: "+age;}
}
OrderList.java
public class OrderList<Type1> {
Type1 orderlist[];
int Length;
public OrderList()
{
this.Length=0;
}
boolean isFuLL()
{
if(Length==orderlist.length)
return true;
else
return false;
}
boolean isEmpty()
{
if(Length==0)
return true;
else
return false;
}
void insert(Type1 p)
{
if(isFuLL())
{System.out.print("线性表已经满了,不能插入元素了!");
System.out.println();
return ;}
orderlist[Length]=p;
Length++;
}
void insert(Type1 p,int i)
{
if(isFuLL())
{
System.out.print("线性表已经满了,不能插入元素了!");
System.out.println();
return ;
}
for(int j=Length;j>i;j--)
orderlist[j]=orderlist[j-1];
orderlist[i]=p;
Length++;
}
Type1 delete(int i)
{
if(isEmpty())
{
System.out.print("线性表已经空了,不能再删除元素了!");
System.out.println();
return null;
}
if(i>=Length)
{
System.out.print("删除位置错误,不能再删除元素了!");
System.out.println();
return null;
}
Type1 p=orderlist[i];
for(int j=i;j<Length-1;j++)
orderlist[j]=orderlist[j+1];
Length--;
return p;
}
}
joserf.java
public class joserf <Type1>{
OrderList<Type1>jos=null;
void killed(int m,int n)
{
int k;
while(jos.Length>1)
{
k=(m+n-1)%jos.Length;
Type1 p=jos.delete(k);
System.out.print(p.toString()+" 被杀");
System.out.println();
}
System.out.print(jos.orderlist[0].toString()+" 赦免");
System.out.println();
}
}
Test.java
import java.util.*;
public class Test {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
System.out.print("请输入总人数:");
int n;
n=cin.nextInt();
int i;
OrderList<Person>p=new OrderList<Person>();
p.orderlist=new Person
;
Scanner str=new Scanner(System.in);
Person p2[]=new Person
;
for( i=0;i<n;i++)
{
p2[i]=new Person();
p2[i].name=str.nextLine();
p2[i].age=cin.nextInt();
}
for( i=0;i<n;i++)
{
p.insert(p2[i] );
}
joserf<Person>j=new joserf<Person>();
j.jos=p;
int m;
System.out.print("请输入要数的数:");
System.out.println();
m=cin.nextInt();
j.killed(m, n);
}
}
约瑟夫环问题是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到只剩1人。
(1)定义一个Person类,该类有成员属性name、age,成员方法toString,将name和age属性的值作为字符串返回,为该类编写构造方法。
(2)使用泛型定义一个顺序表类OrderList,参考上课所讲内容及数据结构相关要求完成该类。
(3)定义测试类,在改类中创建n个Person类的对象并插入顺序表中,从第1个人开始数数到第m个人时删除,然后接着从下一个人开始数,数到第m个人时删除,以此类推,最后剩下一个人时即为幸存者。(数数时,如果到了末尾则下一个是表头的元素)
Person.java
public class Person {
String name;
int age;
public Person(){}
public Person(String S,int a)
{this.name=S;
this.age=a;}
public String toString()
{return "姓名: "+name+"年龄: "+age;}
}
OrderList.java
public class OrderList<Type1> {
Type1 orderlist[];
int Length;
public OrderList()
{
this.Length=0;
}
boolean isFuLL()
{
if(Length==orderlist.length)
return true;
else
return false;
}
boolean isEmpty()
{
if(Length==0)
return true;
else
return false;
}
void insert(Type1 p)
{
if(isFuLL())
{System.out.print("线性表已经满了,不能插入元素了!");
System.out.println();
return ;}
orderlist[Length]=p;
Length++;
}
void insert(Type1 p,int i)
{
if(isFuLL())
{
System.out.print("线性表已经满了,不能插入元素了!");
System.out.println();
return ;
}
for(int j=Length;j>i;j--)
orderlist[j]=orderlist[j-1];
orderlist[i]=p;
Length++;
}
Type1 delete(int i)
{
if(isEmpty())
{
System.out.print("线性表已经空了,不能再删除元素了!");
System.out.println();
return null;
}
if(i>=Length)
{
System.out.print("删除位置错误,不能再删除元素了!");
System.out.println();
return null;
}
Type1 p=orderlist[i];
for(int j=i;j<Length-1;j++)
orderlist[j]=orderlist[j+1];
Length--;
return p;
}
}
joserf.java
public class joserf <Type1>{
OrderList<Type1>jos=null;
void killed(int m,int n)
{
int k;
while(jos.Length>1)
{
k=(m+n-1)%jos.Length;
Type1 p=jos.delete(k);
System.out.print(p.toString()+" 被杀");
System.out.println();
}
System.out.print(jos.orderlist[0].toString()+" 赦免");
System.out.println();
}
}
Test.java
import java.util.*;
public class Test {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
System.out.print("请输入总人数:");
int n;
n=cin.nextInt();
int i;
OrderList<Person>p=new OrderList<Person>();
p.orderlist=new Person
;
Scanner str=new Scanner(System.in);
Person p2[]=new Person
;
for( i=0;i<n;i++)
{
p2[i]=new Person();
p2[i].name=str.nextLine();
p2[i].age=cin.nextInt();
}
for( i=0;i<n;i++)
{
p.insert(p2[i] );
}
joserf<Person>j=new joserf<Person>();
j.jos=p;
int m;
System.out.print("请输入要数的数:");
System.out.println();
m=cin.nextInt();
j.killed(m, n);
}
}
相关文章推荐
- Amazon OA2准备——Round Robin Java实现
- Eclipse安装Genymotion
- cucumber java从入门到精通(3)简单实现及断言
- 在eclipse下使用maven搭建Struts2,Hibernate4和Spring4开发环境
- eclipse环境安装&Robotium自动化测试环境安装&RobotiumRecord自动化录制环境安装
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- 如何使用Spring Session实现分布式Session管理
- eclipse下SpringBoot开发和测试
- Spring Security 4.0 CAS实现单点登录
- java并发(三十四)协程kilim
- struts2+easyui实现根据条件检索信息
- Eclipse快捷键
- Java异常处理机制
- 阻止酷狗,腾讯管家占用adb-导致eclipse连不上手机
- java版本多线下载
- spring boot之使用springfox swagger展示restful的api doc
- spring boot之如何添加filter
- Spring动态注册bean实现动态多数据源
- Eclipse操作记录
- SpringMVC学习