Program:
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
凡报到3的人退出圈子,问最后留下的是原来第几号的那位
/* * 求解: 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数), * 凡报到3的人退出圈子,问最后留下的是原来第几号的那位 * * Date Written:2017-12-14 * * */ package test; import java.util.Scanner; public class TestDemo { public static void main(String args[]) { Scanner scan = new Scanner(System.in); System.out.println( "请输入人数:" ); int n = scan.nextInt(); //通过用户输入确定人数 scan.close(); int position = getPosition(n); System.out.println( "最后剩下的人,原来排在第 " + position + " 位" ); } //定义算法 public static int getPosition(int n) { int[] flag = new int[n]; //设置等长数组,用于标记对应人是否出局 int index = 0; //记录当前遍历的人在flag中对应的下标 int remainCount = n; //记录剩余人的个数 int count = 0; //记录当前遍历人数应该喊几(喊3的出具) //循环遍历,直到剩下一个人 while( remainCount > 1 ) { if( flag[index] == 0 ) { //当前人员没有出局 count += 1; //当前人应喊得数字 if( count == 3 ) { //如果数字为3 count=0; //重置计数变量为0,重新开始 flag[index] = 1; //修改标记,将当前人员出局 remainCount--; //剩余人员个数减1 } } index += 1; //下标加1,遍历下一个人员 if( index == n ) { //如果遍历到最后一个人,跳转到第一个人再开始遍历 index = 0; } } /* * 遍历标记数组flag,找到最终剩下的人(对应标记为0) * */ for( int i = 0; i < flag.length; i++ ) { if( flag[i] == 0 ) { index = i; break; } } //位置=下标+1 return index + 1; } }