C++之救济金发放问题
程序员文章站
2023-11-18 18:59:46
n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,A从1开始逆时针数,B从n开始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上)。接下来被官员选中的人(1个或者2个)离开队伍。输入 n,k,m 输出每轮里被选中的人的编号 样例输入 n=1 ......
n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,a从1开始逆时针数,b从n开始顺时针数。在每一轮中,官员a数k个就停下来,官员b数m个就停下来(注意有可能两个官员停在同一个人上)。接下来被官员选中的人(1个或者2个)离开队伍。输入 n,k,m 输出每轮里被选中的人的编号
样例输入
n=10 k=4 m=3
样例输出
4 8 9 5 3 1 2 6 10 7
#include <stdio.h>
#include <stdlib.h> 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("\n"); system("pause"); }
上一篇: SQL必知必会笔记过滤数据