问题
今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举
一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的
规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),
凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。
请你通过编写程序,求出一组人中的队长是原来第几位同学。
思路和结果
思考过程太过曲折,这里不多赘述,直接贴代码
package collection_Task4;
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
/*********************选队长*********************/
System.out.println("请输入队伍人数:");
int num = input.nextInt();//记录人数
int[] loop = new int[num];//最初始的圈圈
for(int i = 0;i < loop.length;i++) loop[i] = 1; //初始化为1,表示在场
/**********初始化完毕,开始轮圈叫号**********/
int count = 0; //用于计算当前同学是在场的第几位
int[] outer = new int[num]; //记录下被淘汰的同学序号
game:while(true) { //排除length-1个同学需过多少轮呢
//暂不确定就写了length-1,或许可以把for换成死循环试试?
int check = loop.length;//用于清点在场人数(先设定所有人都在场)
for(int s = 0;s < loop.length;s++) {//判断是否只剩一人在场
if(loop[s] == 0) check--; //有人离场,人数-1
if(check == 1) break game;//只剩一人,退出游戏
}
for(int j = 0;j < loop.length;j++) {//进入淘汰程序
if(loop[j] == 1) count++; //当前位置有人,在场人数+1
if(count == 3) { //数到第三个在场即启动淘汰程序
outer[j] = 1; //记下淘汰的位置(最后不是1的就是队长)
loop[j] = 0; //初始化为0,表示离场
count = 0; //淘汰后归0重数
}
}
}
int leader = 0; //用于指定谁是队长
for(int k = 0;k < loop.length;k++) {
//敲定最终队长花落谁家
if(outer[k] != 1) {
//因为数组从0起算
//所以第k号同学是outer[k+1]
//切记!!!
leader = k+1;
break;
}
}
System.out.println("------转圈结束------");
System.out.println("最终队长是第" + leader + "号同学");
}
}
老规矩,运行结果贴一下
这是具体的思路,写代码一个多小时,这个图画了我一个下午还没画完(手动甜美围笑)