黑马程序员技术交流社区

标题: 分享一个代码……不要喷,只学到了循环 [打印本页]

作者: a623562486    时间: 2016-8-24 21:06
标题: 分享一个代码……不要喷,只学到了循环
有100个人,原始编号分别为1-100号。现从1号开始报数,报数为14号的人立即退出,下一人继续由1开始报数,且所有人报数后不停止,从头继续开始,如此循环,当剩余不足14人时停止报数。
要求用代码实现:剩余多少人?每个人的原始编号是多少?将每个人的原始编号进行降序排列后输出。
代码:
        int[] arr = {1,2,3,4,5,6,7,8,9,10,
                                         11,12,13,14,15,16,17,18,19,20,
                                         21,22,23,24,25,26,27,28,29,30,
                                         31,32,33,34,35,36,37,38,39,40,
                                         41,42,43,44,45,46,47,48,49,50,                                //定义数组arr,列出所有人的原始编号1-100
                                         51,52,53,54,55,56,57,58,59,60,
                                         61,62,63,64,65,66,67,68,69,70,
                                         71,72,73,74,75,76,77,78,79,80,
                                         81,82,83,84,85,86,87,88,89,90,
                                         91,92,93,94,95,96,97,98,99,100,};
               
                int count =0;                                                                        //定义中间变量count
                //定义一个无限循环,使报数理论上无限制地进行下去
                for (; ; ) {
                        count = tool1(count,arr);                                        //调用一次tool1方法,并取出tool1执行一次后的count值
                        int count2 = 0;       
                        for (int i = 0;i < arr.length ;i++  ) {                //定义循环结构,使得每执行一次tool1方法后遍历一次数组(无需输出遍历结果)
                                if (arr[i] > 0) {                                                       
                                        count2++;                                                        //每执行一次tool1后统计数组中非0编号(有效值)的个数count2
                                }
                        }
                        if (count2 < 14) {                                                        //当有效值个数小于14时,跳出无限循环
                                break;
                        }
                }
                System.out.println("报数停止时共剩余" + count + "人。");        //得到报数停止时剩余人数
                System.out.println();
                System.out.println("(计算过程,,可以不输出)最后所有人的编号为");
                tool2(arr);                                                //遍历结果并输出(可以不输出),准备进行降序排列
                int[] newArr = new int[count];
                tool3(count,arr,newArr);                        //调用tool3方法,降序排列
                System.out.println();
                System.out.println("剩余人的原始编码分别是");
                tool2(newArr);                                                                //输出降序排列后的遍历结果
                System.out.println();
        }

        //定义工具方法1,接收并返回数据count、数组arr[]
        public static int tool1(int count,int[] arr) {       
                for (int i = 0;i < arr.length ;i++ ) {
                        //遍历数组,并拿出每一数据进行if选择
                        if (arr[i] > 0) {                                               
                                count++;                                                       
                                if (count == 14) {
                                        //通过统计值达到count=14时将对应人的原始编号改为0,初始化count
                                        //并在下次循环时通过arr[i]>0条件跳过,不更改count
                                        count = 0;
                                        arr[i] = 0;
                                }
                        }
                }                               
//返回count的值,准备进入下次循环
                return count;
        }
       
        //定义数组遍历的工具方法2
        public static void tool2(int[] arr){                                               
                for (int i = 0;i < arr.length ;i++ ) {
                        System.out.print(arr[i] + "  ");
                }
                System.out.println();
        }

        //定义数组降序排列的工具方法3
        //原数组长度为arr.length,新数组长度为count
        public static int tool3(int count,int[] arr,int[] newArr) {
                int j = 0;
                for (int i = 0;i < arr.length ;i++ ) {
                        if (arr[i] > 0) {
                                newArr[count - 1 - j] = arr[i];
                                j++;
                        }
                }
                return count;
        }

作者: 阿卜    时间: 2016-8-24 21:40
[Java] 纯文本查看 复制代码
public class Test {

        public static void main(String[] args) {
                int arr[] = new int[100];
                for(int index = 0;index < 100;) {
                        arr[index] = ++index;
                }
               
                int count = 1;        //计数器1-14
                int remaiing = 100; //剩余人数
                int tempIndex; //index为99时要对index进行重置,所以设置一个变量复制当前index,避免在各个条件判断语句下都要写index的重置语句
                for(int index = 0;index < 100;index++) {
                        tempIndex = index;
                        if(index == 99)                //最后一个人报完数,将index重置为0。有tempIndex所以只需要在这里写一次。
                                index = -1;
                        if(remaiing == 14)        //剩余人数为14时跳出循环
                                break;
                        if(arr[tempIndex] == 0)        //元素为0证明该人已经退出,跳过进入下一次循环(下一人)
                                continue;
                        if(count == 14) {        //报数达到14,退出该人(将元素值修改为0)
                                arr[tempIndex] = 0;
                                count = 1;                //重新从1开始报数
                                remaiing--;                //剩余人数-1
                        }else {
                                count++;                        //以上情况都没发生,计数器+1
                        }
                }
                //倒着遍历数组,为0的表示已退出,不输出。
                for(int index = 99;index >= 0;index--) {
                        if(arr[index] == 0)
                                continue;
                        System.out.println(arr[index]);
                }
        }

}

作者: q291793758    时间: 2016-8-24 21:42
public class testg {
    public static void main(String[] args) {
        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));
    }
}
作者: 小超超    时间: 2016-8-24 22:48
学习了,谢谢
作者: li--yong    时间: 2016-8-24 23:07
代码好长啊
作者: 974839876    时间: 2016-8-24 23:36
太长了  要晕了
作者: gqx1990    时间: 2016-8-24 23:38
我也看看
作者: caoshenv5    时间: 2016-8-24 23:53
好长好长啊,看着都头疼了,慢慢看还是能看懂的
作者: cg1693378787    时间: 2016-8-25 00:48
看了楼主的的代码之后学习了、淡定了,遇到更繁杂的事情也不容易上火了,——>发现思想心态不是一般的重要,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2