约瑟环问题

实现30个人轮流报数,9出局,循环,剩下15个人。

方法一:

package Two;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Administrator on 2016/8/19.
 */
public class JosephProblem {

    public static void main(String[] args) {
        //30人围成一圈
        List<Integer> personCycle=new ArrayList<Integer>();
        for(int i=1;i<=30;i++){
            personCycle.add(i);
        }
        //报号开始位置
        int callNum=1;
        while (personCycle.size()>15){
            for(Iterator<Integer> it=personCycle.iterator();it.hasNext();){
                Integer no=(Integer)it.next();
                if(callNum++==9){
                    System.out.println(no);
                    it.remove();
                    callNum=1;
                }
            }
        }
    }
}

上面使用到迭代器,用迭代器移除,很清晰。

 

方法二:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * .约瑟环问题。
 * 30个人围成一个圈,从第一个开始一次报数,
 * 每数到第九人丢出去,剩15。
 * Created by ZL on 2016/8/19.
 */
public class Second {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList();
        for(int i=1;i<31;i++){
            list.add(i);
        }
        System.out.println(list);
        int count=1;//数数
        int index=0;// 移除的下标
        while(list.size()>15){
            count++;
            index++;
            if(count%9==0){
                list.remove(index);
               // System.out.println(list);
                index--;
            }
            if(index==list.size()){
                index=0;
            }
        }
        System.out.println("教徒的排法:"+list);
//[1, 2, 3, 4, 10, 11, 13, 14, 15, 17, 20, 21, 25, 28, 29]
    }
}

方法二是自己写的,主要思路比较简单: 

   1.一直数,count计数,被9整除,余数为0,移除,那么移除需要一个下标index.

   2.集合下标从0开始,index初值为0,count从1计数。

   3.当移除一个数后,index需要减少一个,于是在移除后index--;

   4.当到了集合最后时,连接到开始继续数数,于是当到了最后元素再数一个后,连接到开始index = 0; 条件即:index==list.size();size比序号大1.正好。

   5.于是就形成了环。

posted on 2016-08-19 15:16  青木堂  阅读(1657)  评论(0编辑  收藏  举报

导航