排队 报数 退出

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

 

 1 #include<stdio.h>
 2 #define NMAX 50
 3 
 4 int main()
 5 {
 6     int num[NMAX],*p,n,i,three_count,out_count;
 7 
 8     printf("input man num:");
 9     scanf("%d",&n);    
10     p = num;
11 
12     for(i=1;i<n+1;i++)
13         *p++ = i;
14 
15     //查看数据。
16     for(i=0;i<n;i++)
17 //    printf("%d ",*(p-i-1));
18     printf("%d ",num[i]);
19     printf("\n");
20 
21     p = num;
22     three_count =0;
23     out_count=0;
24 
25     for(i=1;i<n+1;i++)
26     {
27         if(*p!=0)
28         {
29             three_count++;
30             if(three_count==3)
31             {
32                 three_count = 0;
33                 //这里很容易出错
34                 if((++out_count)==n)
35                 {
36                     printf("\nThis Left is:%d\n",*p);
37                 //    *p = 0;//注释掉就可以看到剩下的那个人员啦。    
38 
39                     break;
40                 }
41                 printf("%d ",*p);    
42                 *p = 0;    
43             }
44         
45         }
46 
47         p++;
48 
49         //如果走到了尽头,但是还没out完(即break),那么从头再来。
50         if(i == n)
51         {
52             p = num;
53             //因为for里的i++会让它自动变为1,所以设置为0是比较好的。
54             i = 0;
55         }
56 
57     }
58 
59     //验证是不是已经全部退出圈子。
60     printf("now the result is:");
61     for(i=0;i<n;i++)
62     {
63         printf("%d ",num[i]);
64     }
65     printf("\n");
66 
67     return 0;
68 }

 

 经典100例里是这样写的,特别经典:

 1         i = 0;
 3     while(out_count<n-1)
 4     {
 5         if(*(p+i)!=0)
 6             three_count++;
 7 
 8         if(three_count==3)
 9         {
10             *(p+i)=0;
11             printf("%d\n",num[i]);
12             three_count=0;
13             out_count++;
14         }
15 
16         i++;
17 
18         if(i==n)
19             i=0;

20     } 

 

posted @ 2012-05-02 15:16  zhengmian  阅读(457)  评论(0)    收藏  举报