用简单的C语言写有n个人国成一圈,顺序排号,从第一个人开始报数(从到报数),凡报到乡的人退出圈子,问最后留下的是原来第几号的人。
时间: 2024-04-23 22:07:32 浏览: 62
有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。.txt
以下是用C语言实现的代码:
```c
#include <stdio.h>
int main() {
int n, m, i, p = 0;
printf("请输入总人数n和报数m:");
scanf("%d%d", &n, &m);
int a[n]; // 定义数组a,存储每个人的编号
for (i = 0; i < n; i++) {
a[i] = i + 1; // 初始化每个人的编号
}
for (i = 0; i < n - 1; i++) {
int count = 0;
while (count < m) {
if (a[p] != 0) { // 如果这个人还在圈子中
count++; // 报数
}
if (count == m) {
a[p] = 0; // 报到m,退出圈子
}
p++; // 下一个人
if (p == n) { // 到达最后一个人,从头开始
p = 0;
}
}
}
for (i = 0; i < n; i++) {
if (a[i] != 0) { // 找到最后一个人
printf("最后留下的是原来第%d号的人\n", a[i]);
break;
}
}
return 0;
}
```
思路如下:
1. 首先输入总人数n和报数m。
2. 定义一个数组a,存储每个人的编号,初始化为1到n。
3. 进行n-1轮游戏,每轮游戏一个人退出圈子。
4. 在每轮游戏中,从当前位置p开始报数,如果报到m,将这个人的编号设为0表示退出圈子。
5. 根据报数顺序找到下一个人,如果到达最后一个人,从头开始。
6. 最后找到数组中不为0的数,即为最后留下的人的编号。
例如,当输入总人数n为7,报数m为3时,输出最后留下的是原来第4号的人。
阅读全文