第一封技术博客,从小白开始,一同成长!
审题:围成一圈报数,固当第一次报到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”,所以从头开始即可找,序号本身不变,只是喊的“到”会变)
祝进步!