/*有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位*/
public class Test01{
public static void main(String[] args) {
System.out.println("退出顺序:");
int remain = JohnsonRing(6, 3);
System.out.println("最后剩余者:" + remain);
}
//length个人围成一圈,报到seg退出,返回最后留下人的序号(>=1)
public static int JohnsonRing(int length, int seg){
int[] arr = new int[length];
int i, k, n;
//设置每一个人的出局标志:0在列,1退出
for(i=0; i
}
i = 0;
k = 1;
n = length;
while(n > 1) {
if(arr[i] == 1){ //当前位置的人已退出,移到下一位置
i = (i + 1) % length;
continue;
}
if(k == seg){ //当前位置的人退出
arr[i] = 1;
n--;
System.out.println(i+1);
i = (i + 1) % length;
k = 1;
}
else{ //继续报数
k++;
i = (i + 1) % length;
}
}
for(i=0; i
}
}
核心函数:
int merc1(int num)
{
if(num==1)
{
return 1;
}
else
{
return (merc1(num-1)+3)%num;
}
}
模拟法实现(可能有语法错误,好久不用java了)
public class Test2 {
public static void main(String[] args) throws IOException {
int n=0;
n = System.in.read();
System.out.println(n);
int tmp = merc(n);
System.out.println(tmp);
}
static int merc(int n)
{
int num[];
num=new int[20];
int count=n;
int step=1;
int i=0;
while(true)
{
if(step==3)
{
num[i]=1;
count--;
if(count==1)
break;
step=0;
}
i++;
if(i==n)
i=0;
if(num[i]==0)
step++;
}
int tmp = 0;
for(int j=0;j
tmp=j;
return tmp;
}
}