約瑟夫問題

功能: 約瑟夫問題衆所周知,原始的約瑟夫問題是這樣的:有n我的,編號爲1,2,..., n,站成一圈,java

 每次第m個將會被處決,直到只剩下一我的。約瑟夫經過給出m來決定赦免其中的一我的。
 例如當n=6,m=5時,5,4,6,2,3將會被依次處決,而1將會倖免。code

 假若有k個好人,和k個壞人,全部人站成一圈,前k我的是好人,後k我的是壞人,
 編寫程序計算一個最小的m,使k個壞人都被處決,而不處決任何好人。get

     
 輸入: k 爲正整數
     
 輸出: 
      
 返回: 最小的m,使k個壞人都被處決,而不處決任何好人。it

 

package huawei;


public final class Demo {
	
	/*
	功能: 約瑟夫問題衆所周知,原始的約瑟夫問題是這樣的:有n我的,編號爲1,2,..., n,站成一圈,
	每次第m個將會被處決,直到只剩下一我的。約瑟夫經過給出m來決定赦免其中的一我的。
	例如當n=6,m=5時,5,4,6,2,3將會被依次處決,而1將會倖免。

	假若有k個好人,和k個壞人,全部人站成一圈,前k我的是好人,後k我的是壞人,
	編寫程序計算一個最小的m,使k個壞人都被處決,而不處決任何好人。

	    
	輸入: k 爲正整數
	    
	輸出: 
	     
	返回: 最小的m,使k個壞人都被處決,而不處決任何好人。
	     
	*/
	

	public static  int getMinimumM(int K)
	{
	    /*在這裏實現功能*/
		int result=1;
		while(true)
		{
			boolean findMin=true;
			for(int i=0;i<K;i++)
			{
				int temp=GetInitNum(result, 2*K-i, i);
				if(temp<K)
				{
					findMin=false;
					break;
				}
			}
			if(findMin)
				break;
			result++;
		}
		return result;
	}

	//m:給定的報的數  n:剩餘人數  order:第幾個淘汰的人
	public static int GetInitNum(int m,int n,int order)
	{
		int tempN=n;
		int result=(m-1)%n;
		while((order--)>0)
		{
			tempN++;
			result=(result+m%tempN)%tempN;
		}
		return result;
	}
	
}
相關文章
相關標籤/搜索