`

格雷码(Gray Code)序列Java实现 (反射式格雷码的生成算法)

阅读更多

格雷码(Gray Code)序列

现代计算机一般采用二进制来表示数据,即用0和1的组合来表示各种信息。格雷码是这样一种排列数字的方式,所有相邻整数在它们的二进制表示中只有一 个位不同。例如,下面是3bit的格雷码(注意开始和结束的数字也只有一位不同):

000 001 011 010 110 111 101 100
 0   1   3   2   6   7   5   4

格雷码具有很多重要的用途。例如,信息在传输的过程中,可能发生问题,某一位从0变到1或者反过来,格雷码的特性能够容易地检测到可能出现的奇数个 错误;在数模转换中,格雷码每次的数据变化量小,因此产生的电流脉冲变化也小,出现故障的几率会下降。格雷码还可以应用在集成电路优化、超立方体结构优 化,甚至包括图书馆书架上的书的摆放方法的优化等问题上。

 

产生格雷码的方法有多种,这里介绍反射式格雷码的生成算法:

gray code

如上图所示,一个bit的格雷码序列只有0,1;

两个bit的格雷码通过一个bit的格雷码序列产生:原始序列前面加上"0",然后把原始序列反序,前面加上"1",最后放在一起形成两个bit的 格雷码;

三个bit的格雷码用类似的方法从两个bit的格雷码产生。

 

======

本题要求生成指定bit的格雷码序列。

输入:

格雷码的位数n

输出:

对应的反射式

(请按照题目中给出的方法生成)

样例输入:

3

样例输出:

000

001

011

010

110

111

101

100

 

 

 

import java.util.Scanner;

public class Gray {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int num = (int)Math.pow(2, n);//根据输入的整数,计算出此Gray序列大小
		String[] s1 = {"0","1"};//第一个Gray序列
		for(int i=2;i<=n;i++){//循环根据第一个Gray序列,来一个一个的求
			int p = (int)Math.pow(2, i);//到了第几个的时候,来计算出此Gray序列大小
			String[] si = new String[p];
			for(int j=0;j<p;j++){//循环根据某个Gray序列,来一个一个的求此序列
				if(j<(p/2)){
					si[j] = "0" + s1[j];//原始序列前面加上"0"
				}else{
					si[j] = "1" + s1[p-j-1];//原始序列反序,前面加上"1"
				}
			}
			s1 = si;//把求得的si,附给s1,以便求下一个Gray序列
		}
		for(int i=0;i<num;i++){
			System.out.println(s1[i]);
		}
	}
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics