您的位置:首页 > 其它

求解约瑟夫环问题

2008-06-26 11:51 218 查看
[align=center]计算机信息工程学院学生实验报告[/align]
专业:_姓名:_ 学号:日期:_

[align=center]课程名称[/align]
[align=center]Java语言程序设计[/align]
[align=center]实验室名称[/align]
[align=center] [/align]
[align=center]实验名称[/align]
[align=center]Java语言程序设计基础训练[/align]
[align=center]指导教师[/align]
[align=center]成绩[/align]
[align=center] [/align]
1、 实验目的
熟悉Java程序结构,掌握基本数据类型的使用方法,熟练运用分支、循环等语句控制程序流程,掌握数组和字符串类型的使用方法。

[align=left]2、 实验原理和内容[/align]
[align=left]求解约瑟夫环问题[/align]
约瑟夫环(Josephus)问题:古代某法官要判决N个犯人的死刑,他有一条荒唐的法律,将犯人站成一个圆圈,从第S个人开始数起,每数到第D个犯人,就拉来处决,然后再数D个,数到的人再处决……直到剩下的最后一个可赦免。

当N=5,S=1,D=2时,约瑟夫环问题执行过程如下图所示。



3、 实验步骤
public class testJosephus{
public static void main(String args[]){
Josephus a = new Josephus(5);
a.print();
System.out.println("Liver is Number "+a.kill(1,2));
}
}

class Josephus{
int ring[];
public Josephus(int n){
ring = new int
;
for (int i = 0;i<n;i++){
ring[i] = i+1;
}
}
public int kill(int s,int d){
int n = ring.length;
int k = 0;
int judge = s-1;
int killer = 0;
while (n>1){
if (ring[judge] != 0){
k++;
}

if (k==d){
ring[judge] = 0;
k = 0;
n--;
}

if (judge == ring.length-1){
judge =-1 ;
}
judge++;

}
for (int i=0;i<ring.length;i++){
if (ring[i] != 0){
killer = i+1;
}
}
return killer;

}

public void print(){
for (int i=0;i<ring.length;i++){
System.out.print(ring[i]+" ");
}
System.out.println();
}
}
4、 程序及运行结果(或实验数据记录及分析)
运行结果为:
1 2 3 4 5
Liver is Number 3
Press any key to continue...

当N=10,S=2,D=3时,运行结果为:
1 2 3 4 5 6 7 8 9 10
Liver is Number 5
Press any key to continue...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: