爬山选队长之圆形循环

爬山吗?—爬山选队长之“圆形循环”(菜鸟学习日记)

题目如下图:

在这里插入图片描述
题意简单地理解成这样:一干人等准备去爬山,为了选队长站成一个圈报数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)); 
		         }
			    }

		  }	
     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值