1、报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。【基本要求】利用单向循环链表存储结构或顺序存储结构模拟此过程,按照出列的顺序印出各人的编号。【测试数据】 m的初值为20;n7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。1、运行环境(软、硬件环境)开发工具:JDK1.6 eclipse6.0 运行环境:Windows XP及其以上系统2、输入的形式和输入值的范围 本个实验所输入的值都强制转化为Int数据类型,因为人数一定是个正整数,
2、而每个人所持的密码将会作为下一次循环的步数,所以也一定是一个整数;初始密码也是步数,所以也是一个正整数。在输入值的取值范围上,每人的密码是一个大于零的整数,初始密码也是一个大于零的整数,人数同样也是一个正整数。3、输出的形式描述 1.可以在以下环境中运行本次实验 在DOS环境中编译“约瑟夫环.Java”文件 在Eclipse6.0及其以上编译环境下运行 2.根据文字要求依次输入人数、每人密码、初始密码等一些数据(见图1.3.2) (图)1.3.24、功能描述 约瑟夫环代码约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元6670年犹太人反抗罗
3、马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说“要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品一起投降了罗马。本次试验的不同点在于有一个初始密码M、每人又有个密码,在他死后(出局)之后将作为下一个循环的步数,这样以此类推得出最后一个幸存者。这个实验主要是模仿约瑟夫环的意思模拟约瑟夫环。差别在与每人的密码将作为下一个循环步数继续开始另一个约瑟夫环的循环处理。最后得到一个出此
4、链表的数字下标代号。5、测试数据初始密码M=20人数为77个人的密码依次为:3,1,7,2,4,8,4最后得到一个出此链表顺序,用每个链表中元素的下标输出数据。二、概要设计1、抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述) 创建Node和LinkList这两个类,在Node类中定义一些函数,为主程序中调用这些函数所服务;LinkList类Head指针调用SetLink函数,然后遍历结点,一次删除结点,使得指针后移。在主函数中运用一个For循环作为足要算法,一次实现约瑟夫环的功能。2、功能模块设计(如主程序模块设计)先创建了一个linklist对象,然后分别申明inCount和res
5、ultIncount这两个私有成员变量。然后通过inCount = Integer.parseInt(input.readLine();把输入的内容转化成INT类型,赋值给inCount。通过一个For循环语句作为其主要算法实现。Node p = link.head, q = link.last; int i = 0;/每个人的密码 int j = 0;/人数 for (;) i+; if (i = m) i = 0; m = p.getData(); System.out.print(p.getCount() + ); link.removeNode(q);/删除Q节点 p = p.getL
6、ink();/Q结点后移 j+; if (j = inCount) break;/如果等于总人数就跳出FOR循环 continue;/继续进行下一个循环 q = q.getLink();/Q的指针往后移 p = q.getLink();/P等于Q的下一个指针 3、模块层次调用关系图三、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。class Node private int data = new int2; private Node link; private static int count = -1; public Node(int data) th
7、is.data0 = data; this.data1 = +count; link = null; public void setData(int data) public int getData() return data0; public int getCount() return data1; public void setLink(Node link) this.link = link; public Node getLink() return link; 在这个结点NODE类中定义了诸如setData、getData、getData、getCount、 setLink、getLin
8、k等一些函数,为主函数调用这些函数做好准备。这也是前期工作 的准备。class LinkList public Node head; public Node last; public LinkList(int data) head = new Node(data); /Head调用NODE的构造函数,初始化Head head.setLink(head); /Head调用SetLink的函数 last = head; public String vistAllNode() /遍历节点 Node next = head; String s = new String(); do s = s + ne
9、xt.getData() + /把指针next指向的对象添加到字符串S中 next = next.getLink(); /把指针后移,获取下一个指针 while (next != head); return s; public boolean removeNode(Node node) / 去掉node的下一个结点 if (node = last) head = head.getLink(); /把头指针指向下一个节点 last.setLink(head); /尾指针=头指针 else if (node.getLink() = last) last = node; /Last指向头指针 els
10、e Node tempN = node.getLink();/申明一个临时的指针TEMPN指向NODE的下一个节点 tempN = tempN.getLink(); /把tempN向后移一个 node.setLink(tempN); /node指向tempN return true; /操作成功返回true public boolean removeAll() /此函数的作用是删除所有的节点 /Head=Head /Last=Head head.setData(0); /head的数据设置为0 public void append(int data) /此函数的作用是加一个节点 Node te
11、mp = new Node(data); /申明TEMP节点 last.setLink(temp); /尾指针指向TEMP指针 last = temp; /尾指针指向TEMP指针 last.setLink(head); /尾指针指向头指针在LinkList类中申明头尾指针head和last,head和last分别调用Node和setLink函数,在进行结点的遍历和,当删除一个结点之后便产生了指针后移的问题,直到头尾指针相同。public class 约瑟夫环 private static LinkList link = new LinkList(0);/申明一个LinkList 的对象 pri
12、vate static int inCount; private static int resultInCount; /申明两个变量 public static void main(String args) throws IOException /主函数抛出异常 int enter; String inputString = new String(); BufferedReader input = new BufferedReader(new InputStreamReader( System.in); /定义一个缓冲流对象 System.out.print(这个程序是解决约瑟夫环的问题。n请
13、输入人数(正整数): inCount = Integer.parseInt(input.readLine();/把输入的内容转化成INT类型,赋值给INCOUNT请输入初始密码: int m = Integer.parseInt(input.readLine(); System.out.println(请输入每个人的密码: for (resultInCount = 0; resultInCount inCount; resultInCount+) inputString = input.readLine(); enter = Integer.parseInt(inputString); link.append(enter); /循环输入的内容放到链表中 link.removeNode(link.last); /去掉
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1