任务概述: 今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举 一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的 规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数), 凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。 请你通过编写程序,求出一组人中的队长是原来第几位同学。
在这个游戏里,主要就是如何使用数组表示一个圈,又如何去报数,报到3的又该怎么退出圈子等等逻辑的问题。
直接上代码:
package com.hyh.task_004;//包名
import java.util.Scanner;//调用Scanner
/** 选队长游戏训练任务
*今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举
* 一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的
* 规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),
* 凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。
* 请你通过编写程序,求出一组人中的队长是原来第几位同学。
*
*/
public class Task_010104_001 { // 定义了一个类
public static void main(String[] args) { //main方法是整个程序的入口处
Scanner input = new Scanner(System.in); //使用Scanner获取控制台的输入,并定义一个input来接收
System.out.print("请输入爬山的人数:"); //提示输入
if (input.hasNextInt()) { //确保输入的是整型数据,不至于输入其它数据类型会报错
int num = input.nextInt(); //输入爬山的人数,通过nextInt()方法让输入的数据类型为整型
int[] studentArray = new int[num]; //定义一个studentArray整型数组,并且数组长度由输入的num决定
int count = 0; //用来数1、2、3的
int left = studentArray.length; //定义一个left用来记录出圈后的人数
System.out.print("给人数编号:");
for (int i = 0; i < studentArray.length; i++) { //给人数排号
studentArray[i] = i + 1; //从 1 开始排号
System.out.print(studentArray[i] + " "); //输出排号后的人数
}
System.out.print("\n出圈的人的顺序为:");
while (left > 1) { //只要圈里的人大于1,就一直进行报数,直到选出(队长)为止
for (int i = 0; i < studentArray.length; i++) { //对一圈人开始报数,这里默认从数组的第一个开始报数
if (studentArray[i] != 0) { //如果有人出圈了,就不进行报数,这里用数字0来标记表示出圈
count++; //只要没有被标记的,就继续进行报数
}
if (count == 3) { //如果报数报到3
System.out.print(studentArray[i] + " ");//就输出该位置的排号
studentArray[i] = 0; //并标记为0,代表出圈
left--; //圈里的人减一
count = 0; //报号从头开始
}
}
}
for (int i = 0; i < studentArray.length; i++) { //对数组进行迭代
if (studentArray[i] != 0) { //如果数组的标记不为0,那么他就是队长
System.out.println("\n队长的排号为:"+studentArray[i]+" 位置为:" + i); //输出队长的位置,也就是数组的下标
}
}
}else{//如果输入人数的数据类型不是整型,则输出相应提示,就不会出现报错哈
System.out.println("你输入的不是整型数据,请输入正确的整型数据!");
}
}
}
运行截图: