有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...