Java-n个人报数

目标效果:


源码:

import java.util.Scanner;

/**
 * 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
 * @author Vivinia
 *
 */
/*思路:以数组作为存储结构,以下标标志同学号码,从头开始循环使不为3的数赋值123,为3的不进行赋值代表已被删掉,最后判断剩余不为3的数的个数,恰巧为1代表只剩一个同学,下表标+1即为原来的第几位同学*/
public class speakNum {
	static int n;
	static int[] people;
	public static void main(String[] args) {		
		System.out.println("请输入人数n:");
		Scanner input=new Scanner(System.in);
		n=input.nextInt();
		people=new int[n];
		
		//开始非3的数设置报数
		selectNoThreeToSet();	
		
		//打印结果
		printResult();
	}

	//开始非3的数设置报数
	private static void selectNoThreeToSet() {
		int notThreeCount=n,num=1;      //不是3的个数,用来作为一个跳出循环的条件,当notThreeCount=1时,跳出循环,代表只剩一个了
		for(int i=0;;i++) {
			if(i==n)           //检索不是只遍历一次数组,需要循环遍历,当下标i自加到数组最后时,需要从0开始自加
				i=0; 
			if(people[i]!=3) {            //只有不为0的进行赋值
				if(num>3)          //报号的数,循环123,如果大于3即4,重新从1开始
					num=1;
				people[i]=num;
				if(num==3)      //当只有报数为3时notThreeCount自减
					notThreeCount--;
				num++;				//如果一个同学报数成功,下一个需要加1(这里不考虑循环回1)
			}
			if(notThreeCount==1)
				break;
		}	
	}
	
	//打印结果
	private static void printResult() {
		int t=0;
		for(int i=0;i<n;i++) {
			System.out.print(people[i]+"\t");
			if(people[i]!=3)				
				t=i;
		}	
		System.out.printf("\n最后剩下的数为原来第%d号的同学\n",t+1);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值