文章标题n个人围成一圈,顺序排号。从第一个人开始报数(1~3),凡报到3的人退出圈子,问最后留下来的是原来几号的那位?

第一封技术博客,从小白开始,一同成长!

审题:围成一圈报数,固当第一次报到3的时候,就应该退出这个圈子,不在进行下面的报数,对计算机而言,就是跳过这个“喊出3的人”
接着从“1,2”开始。怎么跳过呢?给这个是“3”的人标记,让计算机知道有了这个标记之后,下面的人要从“1”开始喊起,直到又遇见了“3”,固应该添加一个循环。随着“3”的不断被标记,没有被标记的越来越少,那没被标记的“3”剩下多少算合适呢?由题意得,“最后留下”,可知要到“其他人都是3”,只有一个不是3为止,所以要在外面对于“标记3”这件事情做一个处理,即在“踢出去”的人大于一个的时候完成上面的事情,只有一个的时候说明达到了目的。最后找出这个数之后,只要解决最后一个问题即可,即找出这个人是原来的第几号。很简单,这个数之前面的数都是0,所以从第一个开始,找出不是0的就可以。
总结一下:即“每个人报数”“遇到3的标记”“处理遇到3的数直到只有一个不是3”“找出最后一个不是被标记的数”
#include"stdio.h"
int main()
{
      int num[50],i,m,k,*p;
      printf("please input number of person:\n");
      scanf("%d",&n);
      p=num;
      for(i=0;i<n;i++)
      *(p+i)=i+1;
      k=0;
      m=0;
      i=0
      while(m<n-1)
      {
         if(*(p+i)!=0) k++;
         if(k==3)
         {
         *(p+i)=0;  //标记3的参数与循环条件挂钩,因为循环决定了次数
         k=0;
         m++;
         }
       i++;
       if(i==n)
       i=0;
     }
  while(*p==0)
  p++;
  printf("the last one is No.%d\n",*p);
  return 0;    

}

想不出来原因:1.围成一圈,并不是每个“1”都由第一个来报数
2.第一轮退出一些“3”后,重新开始新的一轮报数,人少了,对于总数把握不好(解决对策:那就还是总的那些人,报到“3”的,让计算机检查一下,发现是“3”的标记就不处理,转而去下一个不是“3”的标记的数开始处理)
3.标记完不知道干嘛(解决对策:因为没有注意到这是最后一个“不是0”的数,前面的数都是“0”,所以从头开始即可找,序号本身不变,只是喊的“到”会变)
祝进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值