早教吧 育儿知识 作业答案 考试题库 百科 知识分享

有N个人围成一圈,顺序排号。从第一个开始报数,(从1到3报数),凡报道3的人退出圈子,问最后留下的是原来第几号那位

题目详情
有N个人围成一圈,顺序排号。从第一个开始报数,(从1到3报数),凡报道3的人退出圈子,问最后留下的是原来第几号那位
▼优质解答
答案和解析
#include
#define n 100
void main()
{int a[n],i,quit_num,k;
for(i=0;ia[i]=i+1;
quit_num=0;/*出圈人数*/
i=0;
k=0;
while(quit_num{if(a[i]!=0)k++;
if(k==3)
{a[i]=0;
quit_num++;
k=0;
}
i++;
if(i==n)i=0;
}
for(i=0;iif(a[i]!=0)printf("%d",a[i]);
}

能看懂吗?
  再送点详解给你
  #include
  #define N 50 // 排队人数(可任意更改)
  #define CAL 3 //凡报3的人出列(可任意更改)
  //下面是排队编号函数:从h 开始的n个人依次编号1到n
  void stdline(int *h,int n)
  {
  int i;
  for(i=1;i  }
  /*下面函数表示从指针h处开始的人数为boy个人排队,从1报数,每报到call的人出列*/
  void outline(int *h,int boy,int call)
  {
  int *p, chu, callnum;
  /*说明:
  p 工作指针,表示从头依次指向每个元素,点名
  chu 计数器,记录出列的人数
  callnum 计数器,记录点名次序
  */
  chu=0;
  callnum=0;//各计数器清零
  p=h; //开始时,工作指针指向数组首
  printf("出列顺序是:\n");
  while(chu  {
  if(*p!=0) callnum++; //每次加报数
  if(callnum==call) //如果某一个人报到出列数call...
  {
  printf("%5d",*p); //打印编号,表示出列
  chu++; //出列人数加1
  if(chu==boy)//如果全部出列....
  {
  *h=*p; //把最后一个出列人的编号记入地址开始处
  return; //结束
  }
  if(chu%10==0)printf("\n");//每输出10个换行
  callnum=0; //出列后,重新报数
  *p=0; //出列后,将其编号赋零,以示区别
  }
  p++; //工作指针移向下一个人,即下一个数组元素
  if(p>h+boy-1)p=h;/*如果移到最后一个元素的后面,则让指向地址开头继续报数*/
  }
  }
  void main()
  {
  int a[N]; //用数组模拟队列,每个元素代表一个人
  stdline(a,N);//编号
  outline(a,N,CAL);//计算并打印出列顺序
  printf("\n最后留下来的是 %d 号\n",*a);/*在函数中,已经把最后一个人的编号写入了数组首地址处,
  这里输出就可以了*/
  }