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 求破 展开
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 求破 展开
2个回答
展开全部
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;
}
}
//一不小心又帮你改好了~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询