java實現約瑟夫環問題

由m個人圍成一個首尾相連的圈報數。從第一個人開始,從1開始報數,報到n的人出圈,剩下的人繼續從1開始報數,直到所有的人都出圈爲止。對於給定的m和n,求出所有人的出圈順序.

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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++;
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章