##### 选队长
题目:今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举
一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的
规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),
凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。
请你通过编写程序,求出一组人中的队长是原来第几位同学。
**思路**:用一个while死循环套住作为圈子不断地循环,当一组中只有一个人时退出循环,此人就是队长。
内部有一个for是用来循环数组,将报数报到3的数组对应值记为-1,记数index也重新记为0,并且在循环
里计算剩余人数count。
for循环里面有一点需要注意,从第二次循环开始,报数为3的就已经排除,所以需要在循环下添加条件判
断if (nums[i] != -1),记刚才没有报数为3的人
**注意**:每一组是连着上次循环的index,比如一组有10个人,第10个index是1,然后再从头开始算第一个数index是2,依次类推
public class Game {
public static void main(String[] args) {
System.out.println("输入人数");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int[] nums = new int[num];
for (int i = 0; i < nums.length; i++) {
nums[i] = i + 1;
}
int count = 0;
int index = 0;
while (true){
count = 0;
for (int i=0; i < nums.length ;i++){
if (nums[i] != -1){
index++;
if (index == 3){
index = 0;
nums[i] = -1;
}
}
if (nums[i] != -1){
count++;
}
}
if (count == 1){
break;
}
}
for (int i = 1; i <= nums.length; i++) {
if (nums[i-1] != -1){
System.out.println("第"+(i)+"是队长");
}
}
System.out.println(Arrays.toString(nums));
}
}
第二种方法
使用while循环代替for循环,大体思路都差不多
在一个循环里,将报数为3的设置为-1,当下标和总数一样时将下标设置index=0
注意循环完一次数组之后如何让index回归初始
public class Demo2 {
public static void main(String[] args) {
System.out.println("请输入队伍人数:");
Scanner input = new Scanner(System.in);
int people = input.nextInt();
int[] team = new int[people];
int num = team.length;
int count = 0;
int index = 0;
while(num > 1) {
if(team[index] == 0) {
count++;
}
if(count == 3) {
team[index] = -1;
num--;
count = 0;
}
index++;
if(index == num) {
index = 0;
}
}
for(int i = 0;i<team.length;i++) {
if(team[i] == 0) {
System.out.println("队长是原来第"+(i+1)+"位同学");
}
}
}
}