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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

有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;
        }

8 个回复

正序浏览
看了楼主的的代码之后学习了、淡定了,遇到更繁杂的事情也不容易上火了,——>发现思想心态不是一般的重要,
回复 使用道具 举报
好长好长啊,看着都头疼了,慢慢看还是能看懂的
回复 使用道具 举报
我也看看
回复 使用道具 举报
太长了  要晕了
回复 使用道具 举报
代码好长啊
回复 使用道具 举报
学习了,谢谢
回复 使用道具 举报
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));
    }
}
回复 使用道具 举报
[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]);
		}
	}

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马