#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语言时候就遇到过而且当时无从下手,看了网上别人的代码似懂非懂,最后还是草草放弃。所以看到这一题时又出现了当时那种熟悉的感觉,很不想看见它,但是不想又这么放过,就坚持一下仔细考虑,也许坚持坚持就有结果了。
希望能一直坚持坚持。。