有n个人围成一圈,顺序排号。 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

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


package com.ftl;

import java.util.Scanner;

public class Demo6 {

	public static void main(String[] args) {
		// 题目:有n个人围成一圈,顺序排号。
		// 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入有几个人围成一圈:");
		int x = scanner.nextInt();
		Demo6 demo6 = new Demo6();
		int i = demo6.circle(x);
		System.out.println("最后留下的是原来第"+i+"号的那位");
		scanner.close();
	}

	// 题目:有n个人围成一圈,顺序排号。
	// 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
	public int circle(int x) {
		boolean[] arr = new boolean[x];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = true;
		}
		// 用来计数到3时,该位退出圈子
		int count = 0;
		// 用来统计一共有多少人退出了圈子
		int sum = 0;
		for (int n = 0; n < arr.length; n++) {
			for (int i = 0; i < arr.length; i++) {
				if (arr[i]) {
					count++;
					if (count == 3) {
						// 有人退出圈子时,开始重新计数
						count = 0;
						arr[i] = false;
						sum++;
						// 当退出的人数为n-1时,停止运算,找出剩余的最后一人
						if (sum == arr.length - 1) {
							for (int j = 0; j < arr.length; j++) {
								if (arr[j]) {
									return j + 1;
								}
							}
						}
					}
				}
			}
		}
		return 0;
	}

}


控制台输出结果:



对题目进行延伸,对数到几退出不固定死,使其变得可控。

package com.ftl;

import java.util.Scanner;

public class Demo7 {

    public static void main(String[] args) {
        // 问题进阶:有x个人围成一圈,顺序排号。
        // 从第一个人开始报数,凡报到y的人退出圈子,问最后留下的是原来第几号的那位。
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入有几个人围成一圈:");
        int x = scanner.nextInt();
        System.out.println("请确定逢几退出:");
        int y = scanner.nextInt();
        Demo7 demo7 = new Demo7();
        int i = demo7.circle(x, y);
        System.out.println("最后留下的是原来第" + i + "号的那位");
        scanner.close();
    }

    // 问题进阶:有x个人围成一圈,顺序排号。
    // 从第一个人开始报数,凡报到y的人退出圈子,问最后留下的是原来第几号的那位。
    public int circle(int x, int y) {
        boolean[] arr = new boolean[x];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = true;
        }
        // 用来计数到m时,该位置的人退出圈子
        int count = 0;
        // 用来统计一共有多少人退出了圈子
        int sum = 0;
        for (int n = 0; n <=x*y; n++) {
            for (int i = 0; i < x; i++) {
                if (arr[i]) {
                    count++;
                    if (count == y) {
                        // 有人退出圈子时,开始重新计数
                        count = 0;
                        arr[i] = false;
                        sum++;
                        // 当退出的人数为n-1时,停止运算,找出剩余的最后一人
                        if (sum == arr.length - 1) {
                            for (int j = 0; j < arr.length; j++) {
                                if (arr[j]) {
                                    return j + 1;
                                }
                            }
                        }
                    }
                }
            }
        }
        return 0;
    }

}



控制台输出结果:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值