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