中易网

java 约瑟夫环 循环

答案:2  悬赏:20  
解决时间 2021-03-12 07:23
import java.util.*;
public class Sefu {

public static void main(String[] args)
{
int N;int M;int S;
Scanner reader=new Scanner(System.in);
System.out .print("请输入N:");
N=reader.nextInt();
System.out .print("请输入M:");
M=reader.nextInt();
System.out .print("请输入S:");
S=reader.nextInt();

int[] a=new int[N];
for(int h=1;h<=N;h++)
{ a[h-1]=h;
System.out.print(a[h-1]+"\n");}

for(int j=1;j<=N;j++)
{

for( int k=1;k<M;k++)
{
while(S>=N)
S=S-N;
if(a[S]!=0){
S++;

}
else
{S++;
k--;}

}

a[S]=0;
System.out.print(S+" ");
}

}
}
我的约瑟夫环怎么了 后半部分无限循环啊?
如 :
请输入N:13
请输入M:5
请输入S:3
7 12 4 10 3 10 3 10 3 10 3 10 3 求破
最佳答案
import java.util.*;

public class Sefu {

public static void main(String[] args) {
int N;// 总人数
int M;// 从第M个人开始
int S;// 隔S个人出局
Scanner reader = new Scanner(System.in);
System.out.print("请输入N:");
N = reader.nextInt();
System.out.print("请输入M:");
M = reader.nextInt();
System.out.print("请输入S:");
S = reader.nextInt();

int[] a = new int[N];
for (int h = 1; h <= N; h++) {
a[h - 1] = h;
System.out.print(a[h - 1] + " ");
}
System.out.println();
int count;
M = M - 1;// 转成下标
for (int j = 1; j <= N; j++) {
count = 1;// 从1开始报数
while (count != S) {// 如果没有报到S就继续报数
if (a[M] != 0) {// 如果没出局就报数
count++;//报数
for (int i = 1; i < N; i++) {
//然后找下一个(从+1开始找)要报数的人
if (M + i < N) {
//如果M+i没到最后一位
if (a[M + i] != 0) {
//判断是否出局
M = M + i;
//没出局就是从这个人开始了
break;
//不要找了
}else{
continue;
//出局了就i++,看下一个人有没有出局
}

}else{
if (a[M + i-N] != 0) {
//如果M+i过了最后一位,就-N,相当于转了一个圈回到前面
M = M + i-N;
//没出局就从M+i-N开始报数
break;
}else{
continue;
}

}
}
} else {// 如果出局了就跳过找下一个要报数的人
if (M + 1 < N) {
M++;
} else {
M = 0;
// 如果M+1==N就从下标0开始找数组的值不是0的数
continue;
}
continue;// 如果是0就继续
}
}

// 如果报数报到S
System.out.print(a[M] + " ");// 出局
int out=M;//下标为out的出局了
for (int i = 0; i < N; i++) {//找下一个要报数的人
if (M + i < N) {//如果M+i没到最后一位
if (a[M + i] != 0) {//判断是否出局
M = M + i;
break;
}else{
continue;//出局了就i++从下一个开始
}

}else{
if (a[M + i-N] != 0) {
//如果M+i过了最后一位,就-N,相当于转了一个圈回到前面
M = M + i-N;
break;
}else{
continue;
}

}
}
a[out]=0;//出局的设为0
}

}
}

//写完发现我定义的S和M和你定义的是反过来的,不是最好的算法。
//可以把找下一个人的方法抽出来,写成一个方法
//输入一个数组a,找第M个人的下一个人,输出下一个人的下标。
import java.util.*;

public class Sefu {

public static void main(String[] args) {
int N;// 总人数
int M;// 从第M个人开始
int S;// 隔S个人出局
Scanner reader = new Scanner(System.in);
System.out.print("请输入N:");
N = reader.nextInt();
System.out.print("请输入M:");
M = reader.nextInt();
System.out.print("请输入S:");
S = reader.nextInt();

int[] a = new int[N];
for (int h = 1; h <= N; h++) {
a[h - 1] = h;
System.out.print(a[h - 1] + " ");
}
System.out.println();
int count;
M = M - 1;// 转成下标
for (int j = 1; j <= N; j++) {
count = 1;// 从1开始报数
while (count != S) {
// 如果没有报到S就继续报数
count++;// 报数
M=getNext(a, M);
//找下一个没出局(不为0)的数
}
// 如果报数报到S
System.out.print(a[M] + " ");// 出局
a[M]=0;
M=getNext(a, M);//找下一个没出局的数
}

}


public static int getNext(int[] a, int M) {

for (int i = 1; i < a.length; i++) {
if (M + i < a.length) {
if (a[M + i] == 0) {
//如果下一个数的值为0就继续找
continue;
} else {
M=M+i;
return M;
//如果下一个数的值不为0就是这个数。
}
}else{
if (a[M + i-a.length] == 0) {
//如果下一个数的值为0就继续找
continue;
} else {
M=M+i-a.length;
return M;
//如果下一个数的值不为0就是这个数。
}
}
}

return -1;
}
}

//一不小心又帮你改好了~
全部回答
当a[S]=0的时候,你k++和k--同时存在,当然是无限循环,k不断加一减一
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我22岁,骨折后胫骨长好,腓骨中端骨不连,如
拿第二学历的本科毕业证 专业是工程造价 报考
牡丹花的样子,代表什么意思
黛斯美美容美发足浴桑拿用品超市怎么去啊,有
做作业久了或累了脑袋发出吱吱的声音,自己能
机甲旋风战神传奇武器熔桨在哪里得,是不是只
我要一个QQ飞车车队名字,名字要有“彩虹”这
中华渔具地址在哪,我要去那里办事
一叶文学城花千骨哪本章节多些
光威建筑工程咨询公司地址有知道的么?有点事
第一次约会就迟到一个多小时的男生,这样的男
我家荷兰猪一看到我就叫怎么回事
外星人植入人体的是什么?
如何辨别星月菩提是那种植物的籽
大连广达汽车美容会馆这个地址在什么地方,我
推荐资讯
执业药师报考必须是专业目录的专业吗
720p在投影仪里面,是属于上还是中还是下?
14岁女孩胸围应该是多大?感觉我的小。。。还
黑龙江省朗乡林业局三道沟森林经营所卫生所地
将油画和国画结合的最好的现代画家
PET/CT 胰腺癌
时代窗帘重庆路店地址有知道的么?有点事想过
请帮作一首藏头诗,(江培坤坏)和两句藏头诗
我还记得你像个小孩子一样 mp3
有没有判断真丝制品的简单办法?
菱悦V3更换离合器总泵和分泵需要多少钱?
百汇食杂店在哪里啊,我有事要去这个地方
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?