问题描述
- 关于约瑟夫问题,搞不懂思路,不会编程
-
有10个人围成一个圈(编号0-9),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩一个人为止,问此人原来的位置是多少号?(编程实现)速求
解决方案
要用java编程,C我都没学过。。。
解决方案二:
/**
* Title: 编号1-10的人坐在一起围成一个圈 可以数数从1开始数 数3出列 下个人继续开始从1开始数
* Description: 打印最后一名出列是几号
* @author Mr Lv
* @date 2011-11-12
*/
import java.util.List;
import java.util.ArrayList;
public class lzwCode{
public static void main(String [] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i=1; i<=10; i++) {
list.add(i);
}
int m = 0;
while(list.size() > 1) {
for (int j=0; j<list.size(); j++) {
m++;
if (m%3 == 0) {
System.out.println(list.remove(j));
j--;
m = 0;
}
}
}
System.out.println("最后一个人的号码是: " + list.get(0));
}
}
解决方案三:
http://blog.csdn.net/newnewman80/article/details/5989449
解决方案四:
最后的结果是此人原来的编号为3。
public class JosephDemo {
private LinkedList<Integer> perList;
private int start;
private int scale;
private int end;
/**
* @param num
* 总人数,每个人的编号是从0开始的
* @param start
* 起始报数
* @param scale
* 报数为scale的整数倍时淘汰一个人,比如scale为3,则报数为3、6...的人会淘汰
* @param end
* 结束时剩余的人数
*/
public JosephDemo(int num, int start, int scale, int end) {
perList = new LinkedList<Integer>();
for (int i = 0; i < num; i++) {
perList.add(i);
}
this.start = start;
this.scale = scale;
this.end = end;
}
public static void main(String[] args) {
int num = 10;
int start = 1;
int scale = 3;
int end = 1;
JosephDemo yd = new JosephDemo(num, start, scale, end);
Integer[] index = yd.findEnd();
System.out.println("剩下的编号为:");
for (int i = 0; i < index.length; i++) {
System.out.println(index[i]);
}
}
/**
* 找到剩下一个人时的起始编号
*
* @return
*/
private Integer[] findEnd() {
int lastNum = perList.size();
int _start = this.start;
while (lastNum != this.end) {
Integer head = perList.pop();
if (_start % scale == 0) {
lastNum--;
System.out.println("数字为" + _start + "时,移除编号为" + head);
} else {
perList.addLast(head);
}
_start++;
}
Integer[] result = perList.toArray(new Integer[0]);
return result;
}
}
解决方案五:
(百例编程)71.约瑟夫问题
时间: 2024-12-20 16:35:32