//导包 

 import java.util.Scanner; 

 /** 

 问题:有n个人围成一圈,顺序排号。 

   从第一个人开始报数(从1到3报数),凡报到3的人退出圈子, 

   问最后留下的是原来第几号的那位 

 分析:1.创建一个长度为3的数组,仅供报数使用,没遍历一次,报数3的人退出,则循环n-1次后留下1人 

   2.创建一个长度为n的布尔型数组,初始值全为false; 

   3.循环元素为3的数组,对布尔型数组进行检索,每遇到第三个将布尔型数组中的元素改为true,之后检索时遇到true则跳过 

 */ 

 class Cycle{ 

public static void main(String[] args){ 

//创建Scanner的对象 

Scanner sc=new Scanner(System.in); 

//调用方法获取键盘录入的数字 

int n=sc.nextInt(); 

//调用方法quit 

int result=quit(n); 

System.out.println("最后剩下"+(result+1)+"号"); 

} 

public static int quit(int n){ 

//定义同等长度的数组,默认值为false 

boolean[] boo=new boolean[n]; 

//定义长度为3的新数组 

int[] loop=new int[3]; 

//定义变量k用来计数arr的索引 

int k=0; 

//循环n-1次,每次退出一个,最后可留下一个 

for(int i=0;i<n-1;i++){ 

//遍历数组loop 

for(int j=0;j<3;j++){ 

//如果k为true,跳过 

while(boo[k]==true){ 

k+=1; 

//如果索引超出范围,则从0开始 

if(k>=n){ 

k=0; 

} 

} 

//当loop遍历到第三个,boo中的元素赋予true 

if(j==2){ 

boo[k]=true; 

} 

//检索索引依次加1 

k++; 

//如果索引超出范围,则从0开始 

if(k>=n){ 

k=0; 

} 

} 

} 

//定义变量index 

int index=0; 

//遍历数组,寻找剩下的元素为false的索引 

for(int i=0;i<n;i++){ 

//找到后将索引值赋予index 

if(boo[i]==false){ 

index=i; 

} 

} 

return index; 

} 

 }