加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

有n个人围成一圈,顺序排号。从第1个学生开始报数

(2010-06-05 17:39:43)
标签:

杂谈

分类: 计算机及相关应用

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

#include <stdio.h>

#define N    50 // 排队人数(可任意更改)
#define CAL   3 //凡报3的人出列(可任意更改)
  

//下面是排队编号函数:从h 开始的n个人依次编号1到n
void   stdline(int *h,int n)
{
int i;
for(i=1;i<n+1;i++) *(h+i-1)=i;
}



void outline(int *h,int boy,int call)
{
int *p, chu, callnum;
             
chu=0;
callnum=0;//各计数器清零
p=h;      //开始时,工作指针指向数组首
    
printf("出列顺序是:\n");
while(chu<boy)   
{
          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);
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有