为什么这段代码运行不成功?#include <stdio.h> int a[100]; int game(int n, int m, int k) //递归大家做游戏 { //n:小孩总数,m:从下标为 m 的小孩开始报数,k:报数值 int i, j = 0, count = 0, g = -1; //j:当前报数值 do { if (a[m] != 0) { //报数小孩不能为空 j++; if (j == k) { //报数到退出值 a[m] = 0; //该小孩退出队 count++; //剩余小孩数量加一 g = m; //记录最后一个小孩的编号 } m++; //报数 if (m >= n) //当前报数者超出范围 m = 0; //循环到队首 } else { while (a[m] == 0) { //跳过已出队者 m++; if (m >= n) m = 0; } } } while (count < n - 1); //只剩一个小孩时退出循环 for (i = 0; i < n; i++) { //统计还在队内的小孩个数 if (a[i] != 0) { g = i; break; } } return g; //返回队中最后一人编号 } int main() { int i, n, k; scanf("%d %d", &n, &k); //输入小孩总数,报数值 for (i = 0; i < n; i++) a[i] = i + 1; //给小孩编号 printf("The left child is NO %d.\n", game(n, 0, k)); //从第一个小孩开始报数 return 0; }
时间: 2024-02-06 17:03:44 浏览: 18
这段代码可能存在的问题是在递归函数game()中,当剩余小孩数量为1时,应该返回最后一个小孩的编号,而现在代码是返回队中最后一人编号。所以可以将递归函数game()中的返回值改为g+1,即返回记录的最后一个小孩的编号加一。另外,循环计数变量j应该在每次循环中都重置为0,否则会使报数出错。代码修改后的结果如下:
```c
#include <stdio.h>
int a[100];
int game(int n, int m, int k) //递归大家做游戏
{
//n:小孩总数,m:从下标为 m 的小孩开始报数,k:报数值
int i, j = 0, count = 0, g = -1; //j:当前报数值
do {
if (a[m] != 0) { //报数小孩不能为空
j++;
if (j == k) { //报数到退出值
a[m] = 0; //该小孩退出队
count++; //剩余小孩数量加一
g = m; //记录最后一个小孩的编号
}
m++; //报数
if (m >= n) //当前报数者超出范围
m = 0; //循环到队首
j = 0; //重置报数值
} else {
while (a[m] == 0) { //跳过已出队者
m++;
if (m >= n)
m = 0;
}
}
} while (count < n - 1); //只剩一个小孩时退出循环
for (i = 0; i < n; i++) { //统计还在队内的小孩个数
if (a[i] != 0) {
g = i;
break;
}
}
return g+1; //返回队中最后一人编号加一
}
int main()
{
int i, n, k;
scanf("%d %d", &n, &k); //输入小孩总数,报数值
for (i = 0; i < n; i++)
a[i] = i + 1; //给小孩编号
printf("The left child is NO %d.\n", game(n, 0, k)); //从第一个小孩开始报数
return 0;
}
```