圆桌问题

来源:互联网 发布:妙趣横生的算法 编辑:程序博客网 时间:2024/04/30 01:23
/*圆桌问题

编号为1——n的n个人围坐在圆桌前,从某个人开始报数,以1开始,报数为常数m的人离开桌子。
下个人接着从1开始报数,依次重复进行下去,直到全部人都离开桌子。
要求输出各位离开的编号次序。

*/

The most recent one on 2.May.2008, Does it make sense?
=================

#include <stdio.h>
#include <stdlib.h>


#define LENGTH 10
#define ANNOUNCER 4

int main(int argc, char **argv){
    int array[LENGTH];
    int len  = LENGTH;
    int i, j, left;
    for(i = 0; i< LENGTH; i++){//marks the position that is available
        array[i] = 1;
    }
   
    j = 0;

        for(i = 0; i< LENGTH; i = (i+1)%10){//loop until len == 1

            if(array[i] != 0){
                j++;//counter
            }
            if(j==ANNOUNCER){//reached 4, out
                array[i] = 0;//unmark
                len--;
                j = 0;
            }
            if(len == 1){
                break;
            }
        }
       
    for(i = 0;i<10; i++){
        if(array[i] != 0){
             printf("left: %d/n",i);
         }
    }   
   
}

the original post
===============

#include<stdio.h>

void main()
{
    int r[11]={1,2,3,4,5,6,7,8,9,10,11};/*11个人*/
    int i;
    int n=0; /*循环计数*/
    int m=0; /*统计出局人数*/
    int final; /*记录最后一个不为0的数的下标,即为最后剩下人的标号*/
    int final_pre;
    bs:;
    for(i=0;i<11;i++)
      if(r[i]!=0)
       {
          n++;
          final=i;
          if(n==4)/*报数到4的出局*/
          { r[i]=0;
            n=0;
            m++;
            final=final_pre;
          }
          final_pre=final;
       }
    if(m!=10)
        goto bs;

    printf("%d/n",r[final]);/*the only man in the world:*/
    getchar();
}
   

/*
感言:以前也作过这个题。
以前的代码:
#include
  void main()
  { static int a[9]={1,1,1,1,1,1,1,1,2};
   int i,m,n;
   n=0;
   m=0;
   bs:;
   for(i=0;i<9;i++)
   if(a[i]==1)
   {if(n==4)
    { n=0;/*报数*/
     a[i]=0;
    }
    else
     n++;
    }
   else
    { if(a[i]==0)
     {m++; /*统计出局的人数*/
      a[i]=66;/*避免重复计数*/
     }
     if(a[i]==2)
     {if(m==7)/*只剩下一个人了*/
       break;
      else
       goto bs;
     }
  
   }
  for(i=0;i<9;i++)
  if(a[i]==1)
   printf("%d/n",i);
  }

这次的控制语句做的好些。并且用了final,final_pre。就不用去循环检查了。这样看这爽。虽然效率不一定提高能够

*/
原创粉丝点击