約瑟夫問題(有時也稱為約瑟夫斯置換)涩咖,是一個出現(xiàn)在計算機科學(xué)和數(shù)學(xué)中的問題。在計算機編程的算法中繁莹,類似問題又稱為約瑟夫環(huán)檩互。
有n個囚犯站成一個圓圈,準(zhǔn)備處決咨演。首先從一個人開始闸昨,越過 k-2個人(因為第一個人已經(jīng)被越過),并殺掉第k個人薄风。接著饵较,再越過 k-1個人,并殺掉第k個人遭赂。這個過程沿著圓圈一直進行循诉,直到最終只剩下一個人留下,這個人就可以繼續(xù)活著撇他。
問題是茄猫,給定了n和k,一開始要站在什么地方才能避免被處決困肩?
這里不研究數(shù)學(xué)解法划纽,用java模擬整個過程。
通常解決這類問題時我們把編號從0~n-1僻弹,最后結(jié)果+1即為原問題的解阿浓,而ArrayList下標(biāo)正好從0開始,代碼如下:
public static void main(String[] args) {
joseph(4, 2, 1);
}
/**
* @param total 總?cè)藬?shù)
* @param count 數(shù)到幾出列
* @param start 從誰開始
*/
public static void joseph(int total, int count, int start){
ArrayList<String> list = new ArrayList<String>();
for (int i = 1; i <= total; i++) {
list.add("person-"+i);
}
int startIndex = start - 1;
int countActual = count - 1;
while(list.size() > 0) {
startIndex = (startIndex + countActual) % list.size();
System.out.println(list);
System.out.println(list.get(startIndex));
list.remove(startIndex);
}
}
結(jié)果如下: