就是100个人围成一圈 报到14就退出 问最后剩下的是第几个人的那道题 我的方法是这样的
- /**
- * 10、 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
- *
- * @author GP
- *
- */
- public class Test10 {
- private static final int amount = 100;//总人数
- private static final int shift = 14;//点名数
- public static void main(String[] args) {
- List<Integer> list = new ArrayList<Integer>();
- int i = 0;
- while (i++ < amount) {
- list.add(i);//将1到100存入集合
- }
- method(list);
- System.out.println("最后剩下的是第" + list.get(0) + "个人");
- }
- private static void method(List<Integer> list) {
- int count;//用来记录剩下的人数
- int pos = 0;//退出的位置
- while ((count = list.size()) > 1) {
- for (int i = 0; i < shift - 1; i++) {//报数的偏移量是14-1
- pos++;//每报数一次 偏移量增加1
- /*
- * 判断
- * 如果pos等于count 证明已经报到最后一个人的下一个 也就是又从头开始 所以这时将pos置为0
- * pos只有一种情况会大于count 即当某次循环结束时 pos比count小1 但是下面的remove方法将删除了list中的一个元素
- * 这样下一次循环开始时pos和count就是相等的 pos++后 pos就大于count 且只可能大1
- * 所以这样写判断
- */
- if (pos >= count) {
- pos = pos - count;
- }
- }
- list.remove(pos);//将报14的人删掉
- }
- }
- }
复制代码
可是我看到贴吧里有人这样做 连集合都没用 几行代码就解决了 但是小弟不才 死活没看懂这个思路 召唤大神 来给讲讲思路!
- int N = 100;
- int s = 0;
- int m = 14;
- for(int i=2; i<=N; i++) {
- s = (s+m)%i;
- }
- System.out.println("最终会留下的人的编号为:" + (s+1));
复制代码
两段代码的结果是一样的 但是下面这个我真是没看懂 有人知道思路吗 给讲讲呗 {:2_31:} |
|