关于约瑟夫问题,搞不懂思路,不会编程

有10个人围成一个圈(编号0-9),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩一个人为止,问此人原来的位置是多少号?(编程实现)速求

http://blog.csdn.net/newnewman80/article/details/5989449

要用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));  
    }
 }

最后的结果是此人原来的编号为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;
    }
}