有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。c语言不用循环链表
时间: 2023-12-23 22:49:46 浏览: 99
Python使用列表完成程序的编写:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到m报数),凡是报到m的人退出圈子,问最后留下的是原来第几号的人。
5星 · 资源好评率100%
可以使用递归来模拟循环链表的过程。
假设有n个人,编号从1到n,第一个人编号为1。第一轮报数后,报到3的人出圈,剩下n-1个人。假设最后留下的人的编号为f(n),则有以下递推式:
f(n) = (f(n - 1) + k) % n
其中,%表示取模运算,k表示每次报数到第3个人出圈时,从下一个人重新开始报数,即k=3-1=2。当n=1时,f(1)=0,即最后留下的人的编号为0。因为编号是从1开始的,所以最终结果要加1。
下面是递归实现的代码:
```c
#include <stdio.h>
int f(int n) {
if (n == 1) {
return 0;
}
int k = 2; // 每次报数到第3个人出圈
int fn_1 = f(n - 1);
return (fn_1 + k) % n;
}
int main() {
int n;
printf("请输入人数n:");
scanf("%d", &n);
int result = f(n) + 1; // 最后留下的人的编号要加1
printf("最后留下的人的编号是:%d\n", result);
return 0;
}
```
阅读全文