java 编写的格雷码

问题描述:

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]);
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值