public class Students {//创建一个学生类,并且附上属性 学生的编号
private int nums;
public Students() {
}
public int getNums() {
return nums;
}
public void setNums(int nums) {
this.nums = nums;
}
}
/**
* 1、使用面向对象的思想考虑约瑟夫环如何实 (选做)有1000个小孩,每个小孩有一个编号,分别是1#-1000#, 按照编号顺序从1#小孩开始依次手拉手
* 最后1000#小孩和1#小孩手拉手,围成一圈。现在从1#小孩开始1、2、3...报数 ,凡是报到7的倍数的小孩退出,最终会剩下一个小孩,请问是几号小孩。
*
* @author Administrator
*
*/
public class YueSeFU {
private Students[] stus;
public Students[] getStus() {
return stus;
}
public void setStus(Students[] stus) {
this.stus = stus;
}
public YueSeFU(int people) {
stus = new Students[people];
}
//初始化方法 ,给每个孩子附上编号
public void Initialize() {
int nums=1;
for (int i = 0; i < stus.length; i++) {
stus[i] = new Students();
stus[i].setNums(nums);
nums++;
}
}
public int play(int m) {//m表示报几个数的时候淘汰
int count = stus.length;// 表示在圈中的人;
int number = 0;// 表示报的数
int index = 0;
while (count > 1) {// 人数大于1的时候持续报数
if (stus[index].getNums() != -1) {// 如果下标处的nums等于-1那么就不进入循环
++number;//报数
if (number % m == 0) {//如果报的数字是m的倍数,就将当前索引的编号变成-1
stus[index].setNums(-1);
count--;
}
}
index++;
if (index == stus.length) {//防止下标越界
index = 0;
}
}
for (int i = 0; i < stus.length; i++) {//遍历学生数组,找出学生编号不为-1的的学生
if(stus[i].getNums()!=-1) {
return stus[i].getNums();
}
}
return 0;
}
}
public class YueSeFuTest {//测试类
public static void main(String[] args) {
YueSeFU y = new YueSeFU(1000);
y.Initialize();
System.out.println(y.getStus().length);
System.out.println(y.play(7));
}
}
使用面向对象的思维完成约瑟夫环,小孩报数
最新推荐文章于 2022-12-19 13:23:13 发布