2014校選題(五) -- 約瑟夫環問題
阿新 • • 發佈:2019-01-04
題目五
週末了,ACM訓練隊的隊員準備玩玩遊戲,娛樂一下,隊長想了一個好主意,所有隊員站成一個圈,從1開始報數,凡是報出指定數字的人要出列。有人出列後,下個人重新從1開始報數。最後一位“倖存者”要給大家表演個節目。由於隊員正在不斷的壯大,小張想知道他是否需要準備表演,請你設計個程式,幫他確定他是否是“倖存者”。
【輸入】
第一行是n,有n次遊戲,第二行是 m x,表示某次遊戲有m個人,指定被請出列的數字為x。其中n<100,m<1000
【輸出】
最後倖存的那位的原來的號碼。
【樣例輸入】
1
10 5
【樣例輸出】
3
#include <stdio.h> int main() { int n; int i = 0; scanf("%d", &n); while (i < n) { int m; //人數 int x; //指定出列的數字 int j; int a; //結果 scanf("%d%d", &m, &x); // 人數 出列的數字 a = 1; for (j=2; j<=m; j++) { a = (a + x - 1) % j + 1; //為了防止 if (f[n]==0) f[n]=n; } printf("%d\n", a); i++; } return 0; }
簡化 可以先以0-n-1的方式排成序列 最後結果加1
#include <stdio.h> int main() { int n; int i = 0; scanf("%d", &n); while (i < n) { int m; //人數 int x; //指定出列的數字 int j; int a; //結果 scanf("%d%d", &m, &x); // 人數 出列的數字 a = 0; for (j=2; j<=m; j++) { a = (a + x ) % j; } printf("%d\n", a+1); i++; } return 0; }