题目:有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 问最后留下的是原来第几号的那位。
分析: 1.圈子人有序号,并且可以循环报数,用数组来存放。 2.圈子人的状态有两种情况,用1和0表示 3.循环报数遇到3就退出,那么最后只会剩下一个人—>这个便是循环条件 4.设置一个计数器,每次有人报数计数器就加1,当计数器加到3时,这个人退出并将这个人状态标记为0package com.math.forth;import java.util.Scanner;/*** * 题目:有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 问最后留下的是原来第几号的那位。 * 分析:1.圈子人有序号,并且可以循环报数,用数组来存放。 * 2.圈子人的状态有两种情况,用1和0表示 * 3.循环报数遇到3就退出,那么最后只会剩下一个人--->这个便是循环条件 * 4.设置一个计数器,每次有人报数计数器就加1,当计数器加到3时,这个人退出并将这个人状态标记为0 * @author wql * */public class Math16 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入数字个数:"); int n = sc.nextInt(); int[] arr = new int[n]; for (int i = 0; i1){ if(arr[i]==1){ count++; } if(count==3){ arr[i]=0;//遇到数3的人了,退出圈子,标识立马变为0 x--; //标记为1的人数少一个 count=0;//计数器归零,重新计数 } if(i==arr.length-1){ i=-1; } i++;//让人动起来 } }}
这个题目就是一个约瑟夫环问题,以前做过,但今天看到这个面试题依旧想了好久…想吃xiang的郁闷
约瑟夫环很经典参考: