有100三个人的友谊要退出吗站成一排按1,2,3,报数,所有报3的人退出;接着再1,2,3报数,还是报3的人退出…

对N个人进行循环报数,不使用循环链表,使用数组实现。
我们可以首先创建一个含有N个元素的一维数组,元素值为从1-N,如果报到3则将该数组元素设定为0,表示人的退出,直到总人数只剩下一个,则停止执行。
1.可以将报数为3的退出,简化为报数的值对3取余为0的人退出。可使用一个变量记录当前报的数值,执行一次有效的报数循环对该变量进行加1操作即可。
2.多次遍历数组,去除报数%3==0的人。直到只剩下一个元素,
3.如果数组的元素值为0跳过,判断%3是否为0,如果不为0,直接报数加一,如果为0,则将a[i]=0,剩余数目减一,报数加一。
#define N 25
int thelastone()//n个人循环报数,报到3退出,最后剩余第几个人。
int still_num,i,j=1;//stillnum表示剩余的人数
still_num=N;
for(i=0;i&N;i++)
while(still_num&1)
for(i=0;i&N;i++)
if(a[i]==0)
if(j%3==0)
still_num--;
for(i=0;i&N;i++)
if(a[i]!=0)printf(&%d\n&,a[i]);
void main(int argc,char *argv[])
thelastone();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:59492次
积分:1308
积分:1308
排名:千里之外
原创:77篇
转载:14篇
评论:16条
(3)(10)(5)(6)(17)(14)(1)(2)(1)(6)(1)(3)(1)(1)(1)(1)(4)(7)(7)(1)有29人排成一排编号1~29,1号开始1~2报数,报数2的不动报数一的退出,留下的再1~2报数.最后的人是几号?38人呢?69人呢?
29人,最后的人是16号; 第1次,剩下的数字是2的倍数2、4、6.24、26、28 第2次,剩下的数字是2^2=4的倍数4、8.24、28 第3次,剩下的数字是2^3=8的倍数8、16、24 第4次,剩下的数字是2^4=16的倍数16 38人,最后的人是32号; 69人,最后的人是64号; 最后留下的人的编号是这些数字里2的最高次幂
为您推荐:
其他类似问题
扫描下载二维码100人站成一横排,自1起依次报数,报奇数者离队,留下的再次从1开始报数,凡报奇数者又离队,如此下去,最后留下一人,问这个人第一次报的数是多少?是他本人第三次报数的多少倍?
这个数是64 第三次报数时候是64÷2÷2=16我们先确定一共要报几次数:共100个数,第一个报完还剩下50个,第二次报完还剩下25个,第三次报完还剩下12个(此处仔细想想),第四次报完还剩下6个,第五次报完还剩下3个,第六次报完就剩下一个了,也就是第七次报数时就一个人了.所以一共报数6次然后用笔列出前2个数如下:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,在纸上用笔划划,可知道第一次报数后剩下的第一个数是2,第二次报数后剩下的第一个数是4,第三次报数后剩下的第一个数是8,第四次报数后剩下的数是16,观察这几个数2,4,8,16的规律,可知第五次和第六次报数后剩下的第一个数分别是32,64,刚才说过一共要报6次数,所以这个第六次报数后剩下的数就是64.它在第一次报数后的位置减半,即32,第二次报数后位置再减半,即16,这就是它第三次报数时的位置.看完了好评我哦~~
为您推荐:
其他类似问题
扫描下载二维码

参考资料

 

随机推荐