c语言程序设计 :有n个人围成一圈,顺序排号,从第r个人开始报数(从1到m报数),凡是报m的人退出圈子,如此循环; 输入n,rm,(以空格区分) 要求输出最后剩下的是原来第几号哪位。
时间: 2023-12-27 08:11:23 浏览: 39
好的,这是一个经典的约瑟夫问题(Josephus Problem),可以用循环链表或者递归的方式解决。我这里给出一种基于数组的循环解法:
```c
#include <stdio.h>
int main() {
int n, m, r;
printf("请输入 n, m, r(以空格分隔):");
scanf("%d %d %d", &n, &m, &r);
int a[n]; // 存储所有人的编号
for (int i = 0; i < n; i++) {
a[i] = i + 1;
}
int k = r - 1; // 当前开始报数的人的下标
while (n > 1) {
// 从当前位置开始,数 m 个人
k = (k + m - 1) % n;
// 将报数为 m 的人移除
for (int i = k; i < n - 1; i++) {
a[i] = a[i + 1];
}
n--; // 总人数减一
}
printf("最后剩下的是原来第 %d 号的人\n", a[0]);
return 0;
}
```
代码中先读入 n、m、r 三个参数,然后用数组 a 存储每个人的编号。接着在循环中,每次从当前位置开始数 m 个人,然后将报数为 m 的人移除(即将后面的人往前移一位),最后将总人数减一。循环直到只剩下一个人为止,输出该人的编号即可。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)