爬山吗?—爬山选队长之“圆形循环”(菜鸟学习日记)
题目如下图:
题意简单地理解成这样:一干人等准备去爬山,为了选队长站成一个圈报数1—2—3报数,所有报“3”的人从圆圈中踢出,一直报数循环下去,直到剩下最后一个人就是队长。
切入正题,先将所有人标记为0,只要报数为3就标记为1,操作流程如下图:
一般来说for循环的判断条件就是i小于nums.length,因此相当于从最开始的位置遍历到最后一个位置,因此循环只执行一遍,而题中要求的是圆形循环,就是说选出队长之前,循环呈现死循环,当最后一个人选出来即跳出循环。如何进行死循环呢?
方法一:当i=nums. length-1时令其为-1;
用 for循环写
public class Demo10 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入爬山人数:");
int a = scanner.nextInt();
int[] a1 = new int[a];
for(int i=0;i<a;i++) {//给数组所有元素赋值为0
a1[i] = 0;
}
int n = 0;//定义循环次数累计变量n
int m =0;//定义剔除报数为“3”的变量
for(int i=0;i<a;i++) {
if(a1[i]==0) {//判断当数组元素为0时,记一次
n = n+1;
}
if(n==3) {//判断报数为3的人
n = 0;
a1[i] = 1;//将报数为3的人的元素改为1
m = m+1;//剔除报数为3的人
}
if(i==a-1) {//判断到数组最末端位置
i = -1;//重新定义i的值,使之重新循环(即死循环)
}
if(m==a-1) {//判断剔除最后报3的人的m为a-1,跳出死循环
break;
}
}
for(int i=0;i<a;i++) {
if(a1[i]==0) {
System.out.println("做队长的人的编号为:"+(i+1));
}
}
}
}
用while写
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入爬山人数:");
int a = scanner.nextInt();
int[] a1 = new int[a];
for(int i=0;i<a;i++) {//给数组所有元素赋值为0
a1[i] = 0;
}
int n = 0;//定义循环次数累计变量n
int m = 0;//定义剔除报数为“3”的变量
int i = 0;
while(m!=a-1) {
if(a1[i]==0) {//判断当数组元素为0时,记一次
n = n+1;
}
if(n==3) {//判断报数为3的人
n = 0;
a1[i] = 1;//将报数为3的人的元素改为1
m = m+1;//剔除报数为3的人
}
i++;
if(i==a) {
i = 0;
}
}
for(int j=0;j<a;j++) {
if(a1[j]==0) {
System.out.println("做队长的人的编号为:"+(j+1));
}
}
}
}