出圈问题:出圈,n个围成一圈,数到第m个人出圈,再从m个人的下一个人数,依次循环
答案:3 悬赏:20
解决时间 2021-02-07 21:54
- 提问者网友:紫柔同归
- 2021-02-07 00:15
出圈问题:出圈,n个围成一圈,数到第m个人出圈,再从m个人的下一个人数,依次循环
最佳答案
- 二级知识专家网友:恕我颓废
- 2021-02-07 01:37
public class Ysf{
public static void main(String[] args){
int n=10,m=2;
int outNum=0;
int tmp=m;
int index=0;
boolean countOne=false;
int a[]=new int[n];
for(int i=0;i<a.length;i++)
{a[i]=i+1;}
while(outNum<n){//出圈的人数小于总人数
tmp=m;
while(tmp>0){//还没数到m
countOne=false;
while(!countOne){//数一个有效的人
if(a[index]!=-1){//如果这个人没有出圈,则这个计数有效,否则跳过这个人,直到数到下一个有效的人。
countOne=true;
}
index+=1;
if(index>n-1)
index=index-n;
}
tmp--;
}
index-=1;//因为数到有效的人后,index仍然自增了,所以要-1,确定出圈的人。
if(index<0)
index=n-1;
System.out.println(""+a[index]);
outNum++;
a[index]=-1;//表示这个人已经出圈了
}
}
}
public static void main(String[] args){
int n=10,m=2;
int outNum=0;
int tmp=m;
int index=0;
boolean countOne=false;
int a[]=new int[n];
for(int i=0;i<a.length;i++)
{a[i]=i+1;}
while(outNum<n){//出圈的人数小于总人数
tmp=m;
while(tmp>0){//还没数到m
countOne=false;
while(!countOne){//数一个有效的人
if(a[index]!=-1){//如果这个人没有出圈,则这个计数有效,否则跳过这个人,直到数到下一个有效的人。
countOne=true;
}
index+=1;
if(index>n-1)
index=index-n;
}
tmp--;
}
index-=1;//因为数到有效的人后,index仍然自增了,所以要-1,确定出圈的人。
if(index<0)
index=n-1;
System.out.println(""+a[index]);
outNum++;
a[index]=-1;//表示这个人已经出圈了
}
}
}
全部回答
- 1楼网友:24K纯糖
- 2021-02-07 03:30
package test;
import java.util.Vector;
public class Ysf {
static int n = 5, m = 2; // n=总人数,m=第M人
public static void main(String[] args) {
int step = m;
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = i + 1;
}
personOutPrint(step, a);
}
private static void personOutPrint(int stepCount, int[] a) {
if (stepCount < a.length) {// 判断是否绕完一圈
if (a[stepCount - 1] <= n) {// 判断该数字没有被退出
System.out.println("第" + a[stepCount - 1] + "个人退出!");
a[stepCount - 1] += n;// 标示该号人员已经退出
stepCount += m;
personOutPrint(stepCount, a);
}else {
stepCount++;
personOutPrint(stepCount, a);
}
} else {
// 打印圈中剩余人的号码,退出递归
for (int i = 0; i < a.length; i++) {
if (a[i] <= n) {
System.out.println("第" + a[i] + "最后留在圈中!");
}
}
}
}
}
这样用递归的算法变量比较少,较易于理解
- 2楼网友:专属的偏见
- 2021-02-07 02:58
const
m=16;
var
a:array[1..m] of integer;
n,s,i,j:integer;
begin
{初始准备}
for i:=1 to m do
a[i]:=1;
read(n);
writeln('n=',n);
j:=0;
{输出m个出圈人编号}
for i:=1 to m do
begin
{计数清0}
s:=0;
{计数为n时结束}
while s<n do
begin
{处理下标}
if j<m then j:=j+1
else j:=1 ;
{计数}
s:=s+a[j]
end;
{输出出圈人编号}
write(j:3);
{该元素清0}
a[j]:=0
end
end.
____________________________________________
program ___;
const m=8;
var
begin
readln(n);
fillchar(a,sizeof(a),true);
i:=1;
s:=1;
b:=m;
repeat
if i>m
then i:=i mod m;
if a[i]
then begin
if s mod n=0
then begin
a[i]:=false;
writeln(i:2);
b:=b-1
end;
s:=s+1;
end;
i:=i+1;
until b=0;
readln;
end.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯