第四章习题

 

 

例题4-3

 1 #include<stdio.h>
 2 
 3 #define maxn 25
 4 int n, k, m, a[maxn];
 5 
 6 int go(int p,int d,int t)
 7 {
 8     while(t--)
 9     {
10         do
11         {
12             
13             p = (p+d-1+n) % n+1 ;
14 
15         }while(a[p]==0);
16     }
17 
18     printf("(%d %d)\n",p,d);
19 
20     return p;
21 }
22 
23 int main()
24 {
25     while(scanf("%d%d%d", &n, &k, &m) == 3 && n) 
26     {
27         for(int i = 1; i <= n; i++) 
28             a[i] = i;
29         int left = n; //还剩下的人数
30         int p1 = n, p2 = 1;
31         while(left) 
32         {
33             p1 = go(p1, 1, k);
34             p2 = go(p2, -1, m);
35             printf("%3d", p1); 
36             left--;
37             if(p2 != p1) 
38             {
39                  printf("%3d", p2); left--;
40             }
41             a[p1] = a[p2] = 0;
42             if(left) 
43                 printf(",");
44         }
45         printf("\n");
46         }
47         return 0;
48 }

这里最要注意的是13行的移动一位的操作,p = (p+d-1+n) % n+1 是为了在1-n 之间循环 如果是在0 -n 之间循环应该写为 p=(p+d+n)%n

 

 

例题 4-4

 

  1 #include<cstdio>
  2 #include<cstring>
  3 
  4 int codes[8][1<<8];
  5 
  6 int readchar()
  7 {
  8     
  9     int ch=getchar();
 10 
 11     for(;;)
 12     {        
 13         if(ch!='\n')
 14             return ch;
 15 
 16         ch=getchar();
 17     }
 18 }
 19 
 20 
 21 int readint(int n)
 22 {
 23     int value=0;
 24 
 25     while(n--)
 26     {
 27         value=value*2+readchar()-'0';
 28     }
 29 
 30     return value;
 31 }
 32 
 33 
 34 int readcodes()
 35 {
 36     memset(codes,0,sizeof(codes));
 37 
 38     codes[1][0]=readchar();
 39 
 40 /*
 41 
 42     上面的用readchar()的原因是当循环解码一次后最后一个字符会是'\n'
 43     如果不跳过回车,会直接进入下一次循环,导致没有编码头就开始读取编码文本
 44     再次输入时$%**\会算出len为负数,readint()会进入死循环
 45     
 46 */
 47 
 48     for(int len=2;len<=7;len++)
 49         for(int value=0;value<(1<<len)-1;value++)
 50         {
 51             int ch=getchar();
 52 
 53             if(ch==EOF)
 54                 return 0;
 55             if(ch=='\n')
 56                 return 1;
 57 
 58             codes[len][value]=ch;
 59         }
 60 }            
 61 
 62 void printcodes()
 63 {
 64     for(int len=1;len<=7;len++)
 65         for(int value=0;value<(1<<len)-1;value++)
 66         {
 67             int ch=codes[len][value];
 68 
 69             if(ch!=0)
 70                 printf("codes[%d][%d]=%c\n",len,value,codes[len][value]);
 71             else
 72                 break;
 73         }
 74 }
 75 
 76 int main()
 77 {
 78     while(readcodes())
 79     {
 80         
 81         printcodes();
 82 
 83 
 84          //我的实现一
 85 
 86         for(;;)
 87         {
 88             int len=readint(3);
 89             printf("len=%d\n", len);
 90 
 91             if(len==0)
 92                 break;
 93 
 94         for(;;)
 95         {
 96             int value=readint(len);
 97             printf("value=%d\n", value);
 98             
 99             if(value<(1<<len)-1)
100                 printf("%c",codes[len][value]);
101             else
102                 break;
103         }
104 
105         }
106     
107 
108 
109 
110 /*    
111         //书上的实现
112 
113         for(;;) 
114         {
115             int len = readint(3);
116             if(len == 0) break;
117             //printf("len=%d\n", len);
118             for(;;) 
119             {
120                 int v = readint(len);
121                 //printf("v=%d\n", v);
122                 if(v == (1 << len)-1) break;
123                 putchar(codes[len][v]);
124             }
125         }
126         printf("\n");
127 */
128 
129 /*
130         //我的实现二
131 
132          int len=readint(3);
133         printf("len=%d\n", len);
134 
135 
136         if(len!=0)
137             for(;;)
138             {
139                 int value=readint(len);
140                 printf("value=%d\n", value);
141                 
142                 if(value<(1<<len)-1)
143                     printf("%c",codes[len][value]);
144                 else
145                 {
146                     len=readint(3);
147 
148                     if(len==0)
149                     {
150                         printf("len=%d\n", len);
151                         break;
152                     }
153                     printf("len=%d\n", len);
154                 }
155             }    
156 */            
157 
158     }
159 
160     return 0;
161 }

 

posted @ 2017-07-16 10:33  lan126  阅读(149)  评论(0编辑  收藏  举报