java 约瑟夫环 循环

importjava.util.*;publicclassSefu{publicstaticvoidmain(String[]args){intN;intM;intS;S... 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 求破
展开
 我来答
pk5454754
推荐于2018-04-28 · TA获得超过269个赞
知道小有建树答主
回答量:109
采纳率:100%
帮助的人:48.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);//找下一个没出局的数
}

}

/**
 * 得到下一个数的下标
 * @param a
 * @param M
 * @return
 */
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;
}
}


//一不小心又帮你改好了~

百度网友799369c
2013-11-10 · TA获得超过562个赞
知道小有建树答主
回答量:514
采纳率:66%
帮助的人:160万
展开全部
当a[S]=0的时候,你k++和k--同时存在,当然是无限循环,k不断加一减一
追问
我也推到 当a【s】=0时有问题 可是怎么改都不怎么管用啊。。。有没有详细方法呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式