n个人围一圈报数问题

时间:2022-10-05 11:00:35

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

/** * @author Administrator *N个人由N个Int型数值表示,每个Int值代表一个人 *每个人报的数存放在Int值中,可能为1~COUNT *如果代表某人的Int值为COUNT,则表示退出圈子,不再参与报数 *一直循环,对所有非COUNT值的人报数,直到剩下最后一个人为止 */
public class CountOff {
    //N表示报数的人数 
    //COUNT表示从1报到COUNT
    //loop表示报到剩最后一个人时,总共报了多少次数
    static int N = 40 , COUNT = 3, loop=0;
    static int[] people = new int[N]; 
    public static void main(String[] args) {
        int i = countOff(people);
        print(people);
        System.out.println("loop:"+loop);
        System.out.printf("%d个人报数,第%d个人是最后一个",N,i+1);
    }

    static int countOff(int[] people ) {
        int len = people.length;
        int off = 0;//退出圈子的人数
        int c = 1;//报数值 1~COUNT
        int i = 0;
        while (true) {
            if (people[i] != COUNT) {
                people[i] = c++; 
                loop++;
                if (c == COUNT+1) {
                    c = 1;
                    off++;//报到最后一个数COUNT,表明有一人退出
                    if (off == len-1) break;
                }
            }
            i++;
            if (i == len) i=0;
        }

        i = 0;
        while (true) {
            if (people[i] != COUNT) break;
            i++;
        }
        return i;
    }

    static void print(int[] people) {
        int n = 1;
        for (int i : people) {
            System.out.printf("%d ",i);
            if (n++ % 10 == 0)
                System.out.println();
        }
        System.out.println();
    }
}