Gray码生成

方法一:

(1) 1阶Gray码是 0, 1;
(2) 设n>1, 且n-1阶Gray码已定义好,
      将n-1阶Gray码顺序列一遍, 接下来
      将n-1阶Gray码反序列一遍,
      顺序列的码每个前面添0,
      反序列的码每个前面添1.

var
  n,s,i,s1,k,j:longint;
  a:array[0..1000] of longint;
   procedure a10(x,dep:longint);
var
  i:longint;
begin
  if x<>0
  then begin
       a10(x div 2,dep+1);
       write(x mod 2);
       end;
  if x=0
  then begin
         for i:=1 to n-dep+1 do
           write(0);
       end;
end;
begin
  read(n);
  a[1]:=0;
  s:=1;
  for i:=1 to n do
    begin
      s1:=s;
      s:=s*2;
      k:=s1;
      for j:=s1 downto 1 do
        begin
          inc(k);
          a[k]:=a[j]+s1;
        end;
    end;
  for i:=1 to s do
    begin
      a10(a[i],1);
      writeln;
    end;
end.

方法2:

例如:二进制码0101,为4位数,所以其所转为之格雷码也必为4位数,因此可取转成之二进位码第五位为0,即0 b3 b2 b1 b0。


0 xor 0=0,所以g3=0


0 xor 1=1,所以g2=1


1 xor 0=1,所以g1=1


0 xor 1=1,所以g0=1


因此所转换为之格雷码为0111 

var
  a:array[0..10000] of longint;
  s,i,n:longint;
  procedure a10(x,dep:longint);
var
  i:longint;
begin
  if x<>0
  then begin
       a10(x div 2,dep+1);
       write(x mod 2);
       end;
  if x=0
  then begin
         for i:=1 to n-dep+1 do
           write(0);
       end;
end;
  procedure gray(x:longint);
var
  s,x1,x2,i:longint;
begin
  s:=0;
  x1:=x;
  a[x]:=0;
  while x1<>0 do
    begin
      inc(s);
      x1:=x1 div 2;
    end;
  for i:=1 to s do
    begin
      x1:=x and (1<<(i-1));
      x1:=(x1<<(s-i))>>(s-1);
      x2:=x and (1<<i);
      x2:=(x2<<(s-i-1))>>(s-1);
      a[x]:=a[x]+((x1 xor x2)<<(i-1));
   end;
  a10(a[x],1);
  writeln;
end;
begin
  read(n);
  s:=1;
  for i:=1 to n do
    s:=s*2;
  for i:=0 to s-1 do
    gray(i);
end.


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值