C语言解决 n个人 123报数问题
题目: 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈子,问最后留下的是原来第几号的那位。
编程思路
此游戏的关键问题在于解决 n个人围成一圈。下一次报数后每个人的位置发生变化。
我们可以利用一维数组存储每个人的位置。报数时,报到3时,对该元素清零。下一次遇到0元素跳过。每次结束一圈后,用一个变量start记录报到了多少,下一次开始时从变量start的基础上开始加。这样就解决了n个人的循环问题。当然我们也可以构建循环链表进行解决n个人的循环问题。
源代码如下
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 200 //宏定义 定义最大数组元素个数
int main() {
int n = 0; //定义一个变量 接收用户输入的人的个数
int sum0 = 0,start = 0;// sum0表示123中报3的元素个数 start表示每次循环一轮后 下一次数组开头元素为第几个
char a[MAXSIZE] = {0};
printf("请输入参加报数游戏的总人数 n (0 < n < 200):例如:9\n");
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
a[i] = i + 1; //数组赋值,数组值表示刚开始属于第几位。
}
while(n - sum0 > 2)//sum0 表示0的个数,
{ //123报数正常结束后 非0元素个数应该为 2
int k = start;//用于每次循环后记录下一次数组开头非0元素为第几个
for(int j = 0;j < n;j++)
{
if(a[j] != 0)k++; //元素不为0 k+1
if(k == 3) //k = 3时数组元素清零,sum0加1
{
a[j] = 0; k = 0;sum0++;
}
}
start = k; //记录下一圈的开始时的报数数字
}
printf("最后留下的是原来顺序中的:\n");
for(int i = 0;i < n;i++)//输出格式控制
{
if(a[i] != 0)printf("%d",a[i]);
}
return 0;
}
运行结果如下
(1)
(2)程序有不恰当的地方,欢迎指正。