功能: 約瑟夫問題衆所周知,原始的約瑟夫問題是這樣的:有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; } }