使用面向对象的思维完成约瑟夫环,小孩报数

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));

	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值