由m個人圍成一個首尾相連的圈報數。從第一個人開始,從1開始報數,報到n的人出圈,剩下的人繼續從1開始報數,直到所有的人都出圈為止。對于給定的m和n,求出所有人的出圈順序.
import java.util.Scanner;
/**
*使用數組實現約瑟夫環問題
*由m個人圍成一個首尾相連的圈報數。
*從第一個人開始,從1開始報數,報到n的人出圈,
*剩下的人繼續從1開始報數,直到所有的人都出圈為止。
*對于給定的m和n,求出所有人的出圈順序.
*/
public class RingTest{
public static void main(String[] args){
System.out.println("程序說明如下:");
System.out.println("由m個人圍成一個首尾相連的圈報數。從第一個人開始,從1開始報數,報到n的人出圈,剩下的人繼續從1開始報數,直到所有的人都出圈為止。對于給定的m和n,求出所有人的出圈順序.");
//提示輸入總人數
System.out.println("請輸入做這個游戲的總人數:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt();
//提示輸入要出圈的數值
System.out.println("請輸入要出圈的數值:");
int n=sca.nextInt();
System.out.println("按出圈的次序輸出序號:");
//創建有m個值的數組
int[] a=new int[m];
//初始長度,以后出圈一個,長度就減一
int len=m;
//給數組賦值
for(int i=0;i<a.length;i++)
a[i]=i+1;
//i為元素下表,j代表當前要報的數
int i=0;
int j=1;
while(len>0){
if(a[i%m]>0){
if(j%n==0){//找到要出圈的人,并把圈中人數減一
System.out.print(a[i%m]+" ");
a[i%m]=-1;
j=1;
i++;
len--;
}else{
i++;
j++;
}
}else{//遇到空位了,就跳到下一位,但j不加一,也就是這個位置沒有報數
i++;
}
}
}
}
posted on 2010-01-15 23:45
期待明天 閱讀(17115)
評論(4) 編輯 收藏 所屬分類:
Java