100人報數,數到3退出遊戲

2021-10-21 15:20:38 字數 1177 閱讀 2904

有n個人圍成一圈,順序排號。從第乙個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。

這個題目比較經典,也被成為約瑟夫環問題,有興趣的朋友可以去搜搜約瑟夫環。

做乙個簡單的示例,取10個人來報數,然後退出

從上面的示例,可以看出:

定義初始陣列,陣列位置初始值為0

報數器只在值為0的位置報數

報數器報到3時,修改位置值為1,剩餘人數減1

迴圈報數,在剩餘人數為1時退出

陣列迴圈至末尾時,陣列位置置0

如果迴圈到的位置值不為0,位置加1後移

迴圈退出時,列印陣列,輸出值為0的位置

根據上面的題解分析,利用陣列來實現該演算法

/**

* 報數退出

* @param m 總人數

* @param n 報到n時退出

*/public static void reportnumber(int m, int n)

// 完成當次報數後,位置加1

// 若陣列位置值為陣列長度時,說明到了陣列末尾,將位置置0,開啟新一輪的迴圈

arrlocation++;

if (arrlocation == m)

} else

}}

for (int i=0; i上面實現的是剩餘最後乙個人,若題目稍作修改,將剩餘1人修改為人數小於n,則將while條件中 left > 1修改為left > n即可。

list實現方式與陣列類似,略有不同,如下

/*** 報數退出

* @param m 總人數

* @param n 報到n時退出

*/public static void reportnumberlist(int m, int n)

} else

}}

system.out.println(list.get(0));

}

public static void main(string args)
4491

91 測試發現,10個人時,最後剩餘人位置為4,與題解分析相同;100人時,最後剩餘人位置為91

CCF認證 201912 1 報數 (100分)

前言 本人大二在讀煤渣一枚,期末做課設才接觸到ccf,就去了解了一下這個認證考試,覺得很有含金量,就下定決心要考個高分,計畫每2 3天做一道題吧,刷題熟悉套路也鍛鍊自己演算法設計,有時文末附大佬解題方法,做參考同時也對比找到自己的差距。ccf認證 201912 1 報數 100分 一般第一題都比較簡...

n人圍成一圈報數問題

題目 有n個人圍成一圈,順序排號。從第乙個人開始報數 從1到3報數 凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。思路 假如是8人,則需要乙個陣列將8個人的從1到8依次記下每人位數,還需要乙個模擬報數口令的變數該變數最初為0,從1到2在到3,當該變數為3時,此時對應編號的人就要退出 那麼第一...

n人圍成一圈,報數按順序輸出其報數的人編號

問題描述 有n個人圍成一圈,按順序從1到n編號。從第乙個人開始報數,報數3的人退出圈子,下乙個人從1開始重新報數,報數3的人退出圈子。如此迴圈,直到留下最後乙個人。問留下來的人的編號。include define max 50 void left num int a,int n1,int m1 in...