对于大家来说这个问题可能是"蔡"了一点,没办法,不懂就是不懂.
   我想详细了解一下"出圈"的问题:即报数问题.打个比方说:十个人在一起报数,数为6,每当报到数6的人即退出.以此类堆,问最后一个人会是几号:这个问题曾经在很多地方提到过,但说的都不是很详细,我想请各们兄弟或是姐妹们帮个忙,跟我说的详细一点(写代码也可以,用c++写),本人非常感谢.(最好是用数组的方法,不用到指针,小弟万分感谢.).
   

解决方案 »

  1.   

    //数组a[10] 初始全为1,表示该位置未剔除,0表示已经剔除//查找第6个  参数:数组、个数、开始位置
    int findsix(int a[],int num,int start)  
    {  int i=start,n=0;     //初始化从start开始 n=找到的未剔除的个数
       while (1) 
       {   if (i>=num) i=0;  //转了一圈从头来
           if (a[i])         //尚未剔除
           {   n++;
               if (n==6) break;   //已经数到第6个退出循环
           }
           i++;
       }
       return i;         //返回第6个所在的位置
    }int OnlyOne(int a[],int num)   //判断是否只有一个未剔除
    {  int i,n=0,last;          //last最后一个所在的位置
       for (i=0;i<num;i++) if (a[i]) {n++; last=i+1;}    //last++区别于位置0返回
       if (n<=1) return last;      //只有一个,返回位置
       return 0;                   //未完
    }void main(void)
    {  int a[10];
       int i,no=0;
       for (i=0;i<10;i++) a[i]=1;        //初始化为1,还未剔除
       while (1)
       {   no=findsix(a,10,no);          //从no处开始找,找到后返回到no中
           a[no]=0;                      //置为剔除标志0
           printf("out %d\n",no+1);      //序号加1 表示位置(从1开始)
           i=OnlyOne(a,10);              //判断剩1个否  
           if (i)                              
           {   printf("last is %d\n",i);   //最后一个 
               break;                    //退出while循环
           }
           no++;                         //从刚才剔除的位置后一个位置开始下一次 
        }
    }