约瑟环问题
实现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.于是就形成了环。