排队 报数 退出
有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 }
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;
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 }

浙公网安备 33010602011771号