Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1027980
  • 博文数量: 288
  • 博客积分: 10306
  • 博客等级: 上将
  • 技术积分: 3182
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-12 17:00
文章分类

全部博文(288)

文章存档

2011年(19)

2010年(38)

2009年(135)

2008年(96)

我的朋友

分类: C/C++

2008-09-01 15:54:17

有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?
 
 
实现思路:
   1、将n个人放到一个数组中。
   2、完成一次报数,被3整除的,贴上标签,不允许再次报数。
   3、统计数组中没有被贴标签的个数,如果大于1,每个没有贴标签的人再次报数,能被3整除的贴上标签,这样循环直到统计数组中没有被贴标签的个数等于1为止。
   4、找到这个唯一没有被贴标签的学生在数组的位置。
 
代码实现:
    用链表,即时从链表中删除3倍数的节点;
 
    const int MAX_COUNT = 17;
    CList< int,int > lst;
    void Init()
    { 
      for( int i = 0; i< MAX_COUNT; i++ )
      {
        lst.AddTail( i );
      } 
    };
 
    main()
    {
       Init();
       int nCurStep = 1;
 
       POSITION posCur = lst.GetHeadPosition();
       while(  lst.GetCount() > 1 )
       {       
         if( NULL == posCur )
         posCur = lst.GetHeadPosition();
  
         if( ( nCurStep % 3 == 0) )
         {
             POSITION posDel = posCur;
             lst.GetNext( posCur );
             lst.RemoveAt( posDel );
             nCurStep = 1;
         }
         else
         {
             lst.GetNext( posCur );
             nCurStep++;
         }    
      }
 
      int n = lst.GetCount();
      posCur = lst.GetHeadPosition();
      int nLast = lst.GetAt( posCur );
    }
阅读(1185) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~