>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
========================================================================================
目 的
用数组求解约瑟夫问题。
因为数组不能增删,所以本程序将删除的人对应的数组元素清零。
========================================================================================
内 容
本程序共包含2个类:Josephus.class 和 TheDriver.class(driver class)。
========================================================================================
每个类的概述
----------------------------------------------------------------------------------------
1.Josephus.class
*变量介绍
int[] array:数组长度为人数总和,值为{1,2,……,人数总和}。
int totalNum:人数总和。
int startNum:开始报数的那个人的编号。
int nextDis:相临报数人的编号的差值,即如果本次报数人为5号,则下个报数人为 5+nextDis 号。
*构造方法
Josephus(int totalNumber,int startNumber,int nextDistance)
首先给数组array初始化,然后再给类变量赋值,最后将初始报数人对应的位置清零。
Josephus()
this(0,0,0)。
*函数介绍
本类不算构造方法共包含 4 个函数,其中只有 int chooseWho() 为 public。
1.boolean isAtEnd(int index)
检查 index 是否位于数组末尾。如果是,则返回 true。
2.int indexAdvanceOnce(int index)
将 index 只向后移动一位,直到遇到非0的元素为止,而且如果到达数组末尾则从头再来,
返回新的 index。
3.int indexAdvance(int index)
将 index 向后移动 nextDis 位,并将新的 index 位置的元素清零,返回新的 index。
4.int chooseWho()
先将 index 初始化为开始报数人的编号-1,因为 index 对应的是数组操作。
因为开始报数的人在创建对象时已经被清零了,所以这里需要 indexAdvance 总人数-2 次。
最后再 indexAdvanceOnce 1次,则 index 就指向最后留下的那个人了。
返回最后留下的人的编号=index+1。
----------------------------------------------------------------------------------------
2.TheDriver.class
只包含一个main()函数。
使用了幻灯片上的例子作为参数,如果想测试其他的数据可以直接修改。
没用从键盘输入是因为不方便,还不如直接改文件来得快。
经过多次测试,没发现问题。
========================================================================================
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>