编写程序count.c。 假设有n个人(0<n<20)围成一圈,按顺序每人分配一个编号(1,2,3,4,…,n),后续活动中每个人分配的此编号始终不变。 现在,从编号为1的人开始、按编号从小到大顺序方向,从1开始报号,即报号规则为1、2、3..,报到m(0<m<20)的人出列,剩下的人仍组成一圈。 然后从下一个人开始,又从1开始报号,报到m的人出列。 依此类推,直到所有人出列。 输出依次出列的人编号序列。 例如:5个人围成一圈,报到3的人出列,即n=5,m=3则依次出列的编号序列为:3、1、5、2、4 格式要求 输入:scanf("%d%d",&n, &m)输出: (1)如果输入不符合要求,则printf("ERROR" (2)每个出列人的编号输出格式为:printf("\t%d",i)
时间: 2024-02-21 07:57:16 浏览: 39
将一个整数S随机拆分为N个在min~max之间的整数.txt
以下是count.c程序的代码:
```c
#include <stdio.h>
int main()
{
int n, m, i, j, k, a[20] = {0};
scanf("%d%d", &n, &m);
if (n <= 0 || n >= 20 || m <= 0 || m >= 20) {
printf("ERROR");
return 0;
}
i = 0; // i表示当前报数的人,初始为第1个人
j = n; // j表示还剩下的人数,初始为n个人
k = 0; // k表示已经出列的人数,初始为0
while (j > 0) {
i++; // 报数
if (i > n) i = 1; // 如果超过n,则从第1个人重新开始报数
if (a[i - 1] == 1) continue; // 如果这个人已经出列,则跳过
k++; // 记录已经出列的人数
if (k == m) { // 如果报到第m个人了,则出列
printf("\t%d", i);
a[i - 1] = 1; // 标记为已经出列
k = 0; // 重新开始报数
j--; // 剩余人数减1
}
}
return 0;
}
```
该程序首先读入n和m,如果n和m不在0到20之间,则输出"ERROR"。然后利用循环模拟整个出列的过程,使用i表示当前报数的人,j表示还剩下的人数,k表示已经出列的人数,a数组表示每个人是否出列,初始值为0。在每次循环中,先报数,如果这个人已经出列,则跳过,否则记录已经出列的人数,如果报到第m个人了,则出列,输出出列人的编号,将其标记为已经出列,重新开始报数,剩余人数减1。循环直到所有人出列。
阅读全文