用C语言完成下列任务: 任务3: 谁留在最后 【任务描述】 编写函数funC(n)求解以下问题:有n人围坐一圈,按顺时钟依次编号0、1、……、n-1。从0号开始,按顺时钟依次报数1、2、3,报到数3的人退出,余下的人继续报数。依此类推,最后留下3人的编号是多少?假定n是[3,30]上的整数。程序保存到s11C.C。主函数如下所示。 int main() { int n,a[3]=[0) ; printf("输入人数:"); scanf("%d”,&n); funC(n,a); printf(”最后留下3人的编号是:%d,%d,%d",a[0],a[1],a[2]); } 程序运行效果: 输入人数:10 最后留下的3人编号是:3,4,9 【操作提示】 函数求解思路:用一个一维数组保存每个人的状态(0表示已退出,1表示未退出)。利用循环模拟报数,直到剩余人数为3。
时间: 2024-01-21 19:16:53 浏览: 83
```c
#include <stdio.h>
void funC(int n, int a[]) {
int i, j, k, count;
int arr[30]; // 保存每个人的状态,0表示已退出,1表示未退出
for (i = 0; i < n; i++) {
arr[i] = 1; // 初始化,所有人均未退出
}
i = 0; // 从0号开始报数
count = n; // 剩余人数
while (count > 3) { // 直到剩余人数为3
j = 0;
while (j < 3) { // 报数1、2、3
if (arr[i] == 1) { // 如果该人未退出
j++;
}
if (j < 3) { // 还没报到3,继续下一个人
i++;
if (i == n) { // 到达最后一个人,回到第一个人
i = 0;
}
}
}
arr[i] = 0; // 该人退出
count--; // 剩余人数减1
i++;
if (i == n) { // 到达最后一个人,回到第一个人
i = 0;
}
}
// 找出剩下的3个人的编号
k = 0;
for (i = 0; i < n; i++) {
if (arr[i] == 1) {
a[k] = i;
k++;
}
}
}
int main() {
int n, a[3] = {0};
printf("输入人数:");
scanf("%d", &n);
funC(n, a);
printf("最后留下的3人编号是:%d,%d,%d", a[0], a[1], a[2]);
return 0;
}
```
阅读全文