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

xiaoxiao2021-02-28  107

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

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

转载请注明原文地址: https://www.6miu.com/read-38419.html

最新回复(0)