不是VIP会员,不能显示答案

题目解答

题目:
问题描述:(3+3+4+4+4=18分)

将2^n个0和2^n个1,排成一个圈。从任一个位置开始,每次按逆时针的方向以长度为n+1的单位进行数二进制数。要求给出一种排法,用上面的方法产生出来的2^(n+1)个二进制数都不相同。
例如,当n=2时,即2^2个0和2^2个1排成如下一圈:

比如,从A位置开始,逆时针方向取三个数000,然后再从B位置上开始取三个数001,接着从C开始取三个数010,…可以得到000,001,010,101,011,111,110,100共8个二进制数且都不相同。
程序说明
以N=4为例,即有16个0,16个1,数组A用以记录32个0,1的排法,数组B统计二进制数是否已出现过。
程序清单
program noi00;
var
a :array[1..36] of 0..1;
b :array[0..31] of integer;
i,j,k,s,p:integer;
begin
for i:=1 to 36 do a[i]:=0;
for i:=28 to 32 do a[i]:=1;
p:=1;a[6]:=1;
while (p=1) do
begin
j:=27;
while a[j]=1 do j:=j-1;
 a[j]:=1  ;
for i:=j+1to 27 do  a[i]:=0  ;
for i:=0 to 31 do b[1]:=o;
for i:=1 to 32 do
begin
 s:=0  ;
for k:=i to i+4 do s:=s*2+a[k];
 b[s]:=1  ;
end;
s:=0;
for i:=0 to 31 do s:=s+b[i];
if ( s=32  )then p:=0
end;
for i:=1 to 32 do for j:=i to i+4 do write(a[j]);
writeln
end.
考点:
分析:
解答:
评论:
老师: