五十道编程小题目 --- 37 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子 java

【程序37】 

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下

的是原来第几号的那位。 




import java.util.Arrays;
import java.util.Scanner;

import net.mindview.util.Print;

public class Test37 {

	public static void main(String[] args) {
		System.out.println("-------------'%'测试-------------");
		System.out.println("'%' 可以制造出循环的效果:");
		for (int i = 1; i < 10;i++ ) {
			System.out.println(i%4);
		}
		System.out.println("-------------测试结束-------------");
		System.out.println();
		System.out.println();
		System.out.println("-------------测试开始-------------");
		for (int i = 5; i < 40;i++ ) {
			findLast(i);
		}
		System.out.println("-------------测试结束-------------");
		
//		System.out.println("请输入人数:");
//		Scanner s = new Scanner(System.in);
//		int n = s.nextInt();
//		findLast(n);

	}

	private static void findLast(int n) {
		int[] arr = new int[n];
		boolean[] people = new boolean[n];
		Arrays.fill(people,true);
		int i = 0,j = 0, k = 1, m = n;
		for(;j<m; i = ++i%m ,k = ++k%4){
			if(k==0){ //去除k=0的时候,只留下值为1,2,3的k,
				i--; //因为k这时有四个数再循环,当k=0时,当前报数的重报,即下个for循环还是当前报数人
				continue;
			}
			if(people[i]){
				if(k%3 == 0){
					arr[j]  = i+1;
					j++;
					n--;
					people[i] = false;
				}
			}else{
				k--;//如果已经将该人设置为false,则下个人还报当前这个k值,所以k--,与下个for循环的k++抵消
			}
		}
		print(arr);
	}

	// 打印数组
	public static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

}
输出结果:

-------------'%'测试-------------
'%' 可以制造出循环的效果:
1
2
3
0
1
2
3
0
1
-------------测试结束-------------


-------------测试开始-------------
3 1 5 2 4 
3 6 4 2 5 1 
3 6 2 7 5 1 4 
3 6 1 5 2 8 4 7 
3 6 9 4 8 5 2 7 1 
3 6 9 2 7 1 8 5 10 4 
3 6 9 1 5 10 4 11 8 2 7 
3 6 9 12 4 8 1 7 2 11 5 10 
3 6 9 12 2 7 11 4 10 5 1 8 13 
3 6 9 12 1 5 10 14 7 13 8 4 11 2 
3 6 9 12 15 4 8 13 2 10 1 11 7 14 5 
3 6 9 12 15 2 7 11 16 5 13 4 14 10 1 8 
3 6 9 12 15 1 5 10 14 2 8 16 7 17 13 4 11 
3 6 9 12 15 18 4 8 13 17 5 11 1 10 2 16 7 14 
3 6 9 12 15 18 2 7 11 16 1 8 14 4 13 5 19 10 17 
3 6 9 12 15 18 1 5 10 14 19 4 11 17 7 16 8 2 13 20 
3 6 9 12 15 18 21 4 8 13 17 1 7 14 20 10 19 11 5 16 2 
3 6 9 12 15 18 21 2 7 11 16 20 4 10 17 1 13 22 14 8 19 5 
3 6 9 12 15 18 21 1 5 10 14 19 23 7 13 20 4 16 2 17 11 22 8 
3 6 9 12 15 18 21 24 4 8 13 17 22 2 10 16 23 7 19 5 20 14 1 11 
3 6 9 12 15 18 21 24 2 7 11 16 20 25 5 13 19 1 10 22 8 23 17 4 14 
3 6 9 12 15 18 21 24 1 5 10 14 19 23 2 8 16 22 4 13 25 11 26 20 7 17 
3 6 9 12 15 18 21 24 27 4 8 13 17 22 26 5 11 19 25 7 16 1 14 2 23 10 20 
3 6 9 12 15 18 21 24 27 2 7 11 16 20 25 1 8 14 22 28 10 19 4 17 5 26 13 23 
3 6 9 12 15 18 21 24 27 1 5 10 14 19 23 28 4 11 17 25 2 13 22 7 20 8 29 16 26 
3 6 9 12 15 18 21 24 27 30 4 8 13 17 22 26 1 7 14 20 28 5 16 25 10 23 11 2 19 29 
3 6 9 12 15 18 21 24 27 30 2 7 11 16 20 25 29 4 10 17 23 31 8 19 28 13 26 14 5 22 1 
3 6 9 12 15 18 21 24 27 30 1 5 10 14 19 23 28 32 7 13 20 26 2 11 22 31 16 29 17 8 25 4 
3 6 9 12 15 18 21 24 27 30 33 4 8 13 17 22 26 31 2 10 16 23 29 5 14 25 1 19 32 20 11 28 7 
3 6 9 12 15 18 21 24 27 30 33 2 7 11 16 20 25 29 34 5 13 19 26 32 8 17 28 4 22 1 23 14 31 10 
3 6 9 12 15 18 21 24 27 30 33 1 5 10 14 19 23 28 32 2 8 16 22 29 35 11 20 31 7 25 4 26 17 34 13 
3 6 9 12 15 18 21 24 27 30 33 36 4 8 13 17 22 26 31 35 5 11 19 25 32 2 14 23 34 10 28 7 29 20 1 16 
3 6 9 12 15 18 21 24 27 30 33 36 2 7 11 16 20 25 29 34 1 8 14 22 28 35 5 17 26 37 13 31 10 32 23 4 19 
3 6 9 12 15 18 21 24 27 30 33 36 1 5 10 14 19 23 28 32 37 4 11 17 25 31 38 8 20 29 2 16 34 13 35 26 7 22 
3 6 9 12 15 18 21 24 27 30 33 36 39 4 8 13 17 22 26 31 35 1 7 14 20 28 34 2 11 23 32 5 19 37 16 38 29 10 25 
-------------测试结束-------------






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值