linux c练习 有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的哪位. 提示:用数组完成

#include<stdio.h>
#define N 5
main()
{
	int a[N]={0};
	int i=0,count=0,res=0;         //count用于记每个人所报的数,主要关注报3的人;res用于记已经报了3的人,即记下退出循环报数的人
	while(1)
	{
		if(a[i]!=3)     //判断是否为3,若是,跳过
		{
			count++;
			if(count==3)     
			{
				a[i]=3;    //  如果这个人报了3(count记到3),就把这个人记为3(可记为任意数,主要为上面if的判断)
				count=0;
				res++;    
				if(res==N)     //若报了3的人数和总人数一致,即所有人都报了3,那么最后一个就是留下的,输出最后一个的位置。
				{
					printf("是原本的第%d位\n",i+1);
					break;
				}
   			}
   		}
   		
   		i++;
   		if(i==N)
   		i=0;
   	}
}   	

我的做法是先将数组全部初始化,在while(1)内定义i进行循环,思考时候遇到的难点是数组往后是直线单向的,对于这种圆形循环可以定义一个变量用于记循环的次数,当达到总个数后就清零,就达到循环的目的。
刚开始数组内变量值都是0,count在i循环中计数,只要记到三就清零,并把所在的位记为3(记为什么数值无所谓),同时res加1。然后进行下一轮的count计数,这样数组里的3越来越多,0越来越少,就对应游戏中退出的人越来越多,留下的越来越少。当3的个数和总个数一致,也就是最后一个也是3时,循环终止,用break跳出来。这时最后一个3所在的位置就对应游戏中最后留下的人。

最近练习了不少linux c的题目,对这一题略有感触,因为这一题在我以前学习c语言时候就遇到过而且当时无从下手,看了网上别人的代码似懂非懂,最后还是草草放弃。所以看到这一题时又出现了当时那种熟悉的感觉,很不想看见它,但是不想又这么放过,就坚持一下仔细考虑,也许坚持坚持就有结果了。
希望能一直坚持坚持。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值