问题描述:
Gray码是一个长度为2n的序列。序列中无相同的原图,每个元素都是长度为n位的串,相邻元素恰好只有一位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。
算法设计:
n=1时,Gray码:0,1
n=2时,Gray码:00,10, 11,01
n=3时,Gray码:000,010,011,001, 101,111,110,100
n=4,时,Gray码:0000,0010,0011,0001,0101,0111,0110,0100, 1100,1110,1111,1101,1001,1011,1010,1000
从上面可以看出如下规律:从n=2开始,每个n的Gray码由两部分组成。后一位的Gray码可以从前一位的Gray码求出,即,在n的Gray码的前半部分是n-1的所有Gray码顺次在前面加0得到;n的Gray码的后半部分是n-1的所有Gray码逆序在前面加1得到。
实现:
import java.awt.*;
import javax.swing.*;
import java.math.*;
public class gray
{
public static void main(String args[])
{
String []graycode;
int n,pn;
String str=JOptionPane.showInputDialog("请输入n:");
n=Integer.parseInt(str);
pn=(int)Math.pow(2,n);
graycode=new String[pn];
for(int l=0;l<pn;l++)
{
graycode[l]="";
}
code(n,pn,graycode);
}
static void code(int n,int pn,String graycode[])
{
if(0==n)
{
System.out.print("输入错误!");
}
else if(1==n)
{
graycode[0]="0";
graycode[1]="1";
}
else
{
int t=1;
int len=1;
while(t<pn)
{
t=2*t;
len++;
for(int i=0;i<t/2;i++)
{
graycode[i]="0"+graycode[i];
}
for(int j=t;j>t/2;j--)
{
graycode[j-1]="1"+graycode[t-j].substring(1,len-1);
}
}
}
for(int m=0;m<pn;m++)
{
System.out.printf("%3d",m);
System.out.print("的格雷码:");
System.out.println(graycode[m]);
}
}
}