A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 L10052108 于 2016-11-12 15:00 编辑

我写这帖子主要是觉得这个程序,很有意思很多人都玩过这样的游戏,大家排队围成一个圈,开始报数,谁报道某一个数字,就出局。下一个人从头开始报数,报道最后一个人的时候,第一个人开始接着报数,循环起来。
这也是我做过的一道题

下面说说我的思路:我觉得,这道题用集合思想实现比较的好,尤其是使用Arraylist集合,因为集合是有序的。向集合中插入100个数字,代表这100个,每一个人需要报数用cont 表示,位置用index表示,如果报一次数字(count++),报数人也就变成Index++;如果这个人报数是14,让这个人出局,只需要移除对应的index,即可。由于集合特点移除以后,后面人的序号自动减一,为了保证序号正确,index子减。到了最后一个元素,第一个元素接上。循环下去,就可以知道,最后剩下的人是谁了?
代码实现:
[AppleScript] 纯文本查看 复制代码
package com.itheima;

import java.util.ArrayList;

/**
 * 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
 * 
 * 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
 * 
 * @author liuwei
 * 
 */
/*
 * 分析: 使用arrayList集合比较方便,arraylist 是有序的,可以通过序号的判断,来判断是不是需要退出;
 */
public class Test10 {
        public static void main(String[] args) {
                // 创建 集合对象
                ArrayList<Integer> arr = new ArrayList<Integer>();

                // 向集合中添加元素
                for (int x = 1; x <= 100; x++) {
                        arr.add(x);
                }
                // 用于记录报数的
                int count = 0;

                // 用于记录报数到哪一个人的
                int index = -1;

                // 用于记录退出人数的
                int removeTime = 0;
                
                while (true) {
                        
                        count++;
                        index++;
                        
                        if (count >= 14) {
                                count = 0;
                                
                                // 控制台输出移除的数字
                                // System.out.println(arr.get(index)); 
                                
                                arr.remove(index);
                                
                                //  移除以后,后面的元素自动进位,此时的索引的位置应该 -1
                                index--;
                                
                                // 记录移除的次数
                                removeTime++;
                        }
                        if (index >= (arr.size() - 1)) {
                                index = 0;
                        }

                        if (removeTime >= 99) {
                                break;
                        }
                }
//                System.out.println("---------------");
                // 经过 99 次移除以后,集合中现在只剩下一个元素,也就是想要的元素
                System.out.println(arr.get(0));
        }
}

这是我自己做的,可能个别地方有错误,仅供参考,如果发现错误,还希望帮我指出,大家一起学习。
我看到论坛内还有其他同学发的帖子;
觉得不错的,我把链接发了一下
http://bbs.itheima.com/forum.php ... 6%E7%91%9F%E5%A4%AB


[学习交流] 围圈报数(约瑟夫环)的最简代码——7条语句 [复制链接]

http://bbs.itheima.com/forum.php ... 6%E7%91%9F%E5%A4%AB

http://bbs.itheima.com/forum.php ... 6%E7%91%9F%E5%A4%AB
自己多看看论坛,长见识呀

Test10.rar

872 Bytes, 下载次数: 107

7 个回复

倒序浏览
这个很难,到现在都没整出来
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
本帖最后由 L10052108 于 2016-11-9 15:47 编辑
默默默默 发表于 2016-11-9 12:38
这个很难,到现在都没整出来

有点儿绕弯,不过想一想应该不是很难,这个场景并不是很复杂,很多人都玩过这种游戏
回复 使用道具 举报
原来这是经典的 约瑟夫环 问题,真是孤陋寡闻
回复 使用道具 举报
不错哦。。他们想的都是用个链环做。。还是用集合,数组更容易理解。。。运行结果怎么样??
回复 使用道具 举报
poi1234bnm 发表于 2016-11-9 21:59
不错哦。。他们想的都是用个链环做。。还是用集合,数组更容易理解。。。运行结果怎么样?? ...

运行一下就知道了
回复 使用道具 举报
回复 使用道具 举报
学习了  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马