例题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) ",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(" "); 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!=' ') 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()的原因是当循环解码一次后最后一个字符会是' ' 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==' ') 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 ",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 ", len); 90 91 if(len==0) 92 break; 93 94 for(;;) 95 { 96 int value=readint(len); 97 printf("value=%d ", 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 ", len); 118 for(;;) 119 { 120 int v = readint(len); 121 //printf("v=%d ", v); 122 if(v == (1 << len)-1) break; 123 putchar(codes[len][v]); 124 } 125 } 126 printf(" "); 127 */ 128 129 /* 130 //我的实现二 131 132 int len=readint(3); 133 printf("len=%d ", len); 134 135 136 if(len!=0) 137 for(;;) 138 { 139 int value=readint(len); 140 printf("value=%d ", 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 ", len); 151 break; 152 } 153 printf("len=%d ", len); 154 } 155 } 156 */ 157 158 } 159 160 return 0; 161 }