现在的位置: 首页 > 综合 > 正文

低端约瑟夫问题解决(/5个人轮流报数,报到3的出局,求出局序列)

2018年04月18日 ⁄ 综合 ⁄ 共 1283字 ⁄ 字号 评论关闭

今天在百度知道上看看有没有可以帮忙解决的问题

本人小菜,接触java不久,如果有错误 请不要喷。

题目大概意思是 ://5个人轮流报数,报到3的出局,求出局序列

//5个人轮流报数,报到3的出局,求出局序列
public static void main(String[] args) {
int a[] = new int[5];  //1为未出局,0为出局  初始化数组均为1
int allCount =5;  //定义玩游戏的总人数
int outNum =3;    //出局的数
a[0] = 1;    
a[1] = 1;
a[2] = 1;
a[3] = 1;
a[4] = 1;
int i=0;
int count =0 ;//定义一个计数器, 数到3的时候 清零。
int outCount =0; //定义出局人数
while(outCount!=allCount){
i++; //枚举出所有人的位置
if(i >allCount){ // 轮回一圈下来 ,i重新定义为1
i= 1;
}
if(a[i-1]==1){//报数
count ++;  
if(count ==outNum){
//如果报数为3 则出局
a[i-1]=0;
//报数为3的人出局
count=0; //计数器清0
System.out.println(i); //输出出局的人的编号
outCount++;  
//出局人数+1
}
}

}




}

-----------------------------------------------------分割线---------------------------------------------------------------------------------------

题目:500个小孩围成一圈,从第一个开始报数:1,2,3,1,2,3,1,2,3,……每次报3的小孩退出
 问最后剩下的那个小孩,在以前500人里是第几个???

解法一:约瑟夫标准循环非递归解法

	public static void main(String[] args) {
		int n = 500, m = 3;
		int index = 0;
		
		for (int i = 2; i <= n; i++) {
			index = (index + m) % i;
		}
		
		System.out.println(index + 1);
	}

解法二 :一般解法

List<Integer> ch = new ArrayList<Integer>(); // 用一个List来存放500个小孩
		for (int i = 1; i <= 500; i++) {
			ch.add(i);
		}
		int temp = 0;
		for (int j = 0; j < ch.size(); j++) {// 遍历List
			temp++;// 代表数数
			if (temp == 3) { // 如果是数到3则把这个小孩从List中移除 并从1开始数(temp=0)
				ch.remove(j);
				j--;
				temp = 0;
			}
			if (j == ch.size() - 1)// 如果遍历到最后一个则重新开始遍历 j=-1 因为j++ 所以是从j=0开始重新遍历
				j = -1;
			if (ch.size() == 1)// 最后List的大小为1 则只剩下最后一个小孩 打印出来 结束
			{
				System.out.println(ch.get(0));
				break;
			}
		}

抱歉!评论已关闭.