C语言解决 n个人 123报数问题

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)在这里插入图片描述程序有不恰当的地方,欢迎指正。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值