C++の救済金支給問題
1855 ワード
n(n<20)は個人的に1周し,反時計回りに1~nと番号付けした.2人の役人がいて、Aは1から反時計回り、Bはnから順時針数を数えます.各ラウンドにおいて、役人Aがk個数えると止まり、役人Bがm個数えると止まる(2人の役人が同じ人に止まる可能性があることに注意).次に役人に選ばれた人(1人または2人)が列を離れる.n,k,mを入力して各ラウンドに選ばれた人の番号を出力する
サンプル入力
n=10 k=4 m=3
サンプル出力
4 8 9 5 3 1 2 6 10 7
サンプル入力
n=10 k=4 m=3
サンプル出力
4 8 9 5 3 1 2 6 10 7
#include
#include
int main(void)
{
int n, m, k;
int i;
int stemp_m, stemp_k; // AB
int people_num; //
int people_state[20] = {0};
// 0,
// 1 , ,
// 0 ,
printf(" n, A k, B m:"); scanf("%d %d %d", &n, &k, &m); for(i = 1; i <= n; i++) { people_state[i] = 1; } stemp_m = n + 1; stemp_k = 0; people_num = n; while(people_num) { for(i = 0; i < k; i++) // A { do { stemp_k = (stemp_k + 1) % n; if(stemp_k == 0) { stemp_k = n; } } while (people_state[stemp_k] == 0); } for(i = 0; i < m; i++) // B { do { stemp_m = stemp_m - 1; if(stemp_m == 0) { stemp_m = n; } } while (people_state[stemp_m] == 0); } printf("%d ", stemp_k); people_num--; if(stemp_m != stemp_k) { printf("%d ", stemp_m); people_num--; } people_state[stemp_m] = 0; people_state[stemp_k] = 0; } printf("
"); system("pause"); }