#C语言例题讲解:有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 问最后留下的是原来第几号的那位

方法一:(也是最容易理解的)

我们可以想到,如果这个游戏到只剩最后一个人的时候不结束,那么最后的那个人也会被打出去,所以说,最后被打出去的人就是咱们要找的人(并不是废话), 我们要把被踢出去的人与留下的人区分开来,那么a[i]是1代表他留下来了,等于0的话就被踢出去了(i就是第几个人),下面是实现的代码:

#include<stdio.h>
int main()
{
  int a[100];
  int n;//代表一共有多少人
  int i,k = 0;//k代表退出人数的多少
  int count = 0;//报的数1,2,3
  int last;//最后出圈的号码
  printf("请输入人数\n");
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    a[i]=1;//a[i]=0表示在圈外,a[i]=1表示在圈内
  }
  while(k<n)
  {
    for(i=0;i<n;i++)
    {
      if(a[i]==1)//a[i]==0时直接不让他进来,因为他已经被打走了
      {
      count++;//若在圈内则报号
      if(count%3==0)
      {
        a[i]=0;
        k++;
        last=i+1;//每一个被打出去的人都会在这里出先,只不过只有最后一个才能保留下来
      }
      }
    }

  }
  printf("留下来的那个人是%d号",last);
  return 0;
}

法二:

#include<stdio.h>
int main()
{
    int n;
    int a[100],*p;
    scanf("%d",&n);
    p=a;//a的首元地址
    for(int i=0;i<n;i++)
    {
        *(p+i)=i+1;//和a[i]=i+1一样,代表第几个人
    }
    int i=0;
    int k=0;//报数
    int m=0;//记录退出的人数
    while(m<n-1)//当退出人数达到n-1个时就不再循环,剩下的那个数就是报数后剩下的
    {
        if(*(p+i)!=0)//和上个代码一样,如果他等于0,代表他被打出去了
        {
            k++;
        }
        if(k==3)//如果报数为3时
        {
            *(p+i)=0;//开始踢人了 
            m++;//退出人数加一
            k=0;//k重置为0
        }
        i++;//继续报数
        if(i==n)//如果报到最后一个数时,再从头开始依次遍历报数
            i=0;
    }
    for(int i=0;i<n;i++)
    {
        if(*(p+i)!=0)//查找不是0的数,即为最后剩下的数
            printf("剩下的是%d号",*(p+i));
    }
    return 0;
}

希望我的代码能对你们的理解有帮助,祝你也祝我能实现自己的人生理想

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值