视串为首尾相连的环,则由m位二进制数字组成的2m个子序列,每个可能的子序列都互不相同。例如,如果m=3,在串11101000首尾相连构成的环中,由3位二进制数字组成的每个可能的子序列都在环中恰好出现一次,它们依次是111,110,101,010,100,000,001,011,如图9-1所示:
[程序]
1 #define N 1024
2 #define M 10
3 int b[N+M-1];
4 int equal(int k,int j,int m)
5 {
6 int i;
7 for (i=0;i<m;i++)
8 if (b[k+i]!=b[j+i]) return 0;
9 return 1;
10 }
11
12 int exchange(int k,int m,int v)
13 {
14 while (b[k+m-1]==v)
15 {
16 b[k+m-1]=!v; k--;
17 }
18 b[k+m-1]=v; return k;
19 }
20
21 init(int v)
22 {
23 int k;
24 for (k<0;k<N+M-1;k++) b[k]=v;
25 }
26
27 main()
28 {
29 int m,v,k,n,j;
30 printf("Enter m(1<m<10),v(v=0,v=1)\n");
31 scanf("%d%d",&m,&v);
32 n=0x01<<m;
33 init(!v);
34 k=0;
35 while (++k<n)
36 for (j=0;j<k;j++)
37 if (equal(k,j,m))
38 {
39 k=exchange(k,m,v);
40 j=-1;
41 }
42 for (k=0;k<n;k++) printf("%d\n",b[k]);
43 }