Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 669|回复: 0

[算法学习]求格雷码(Gray Code)序列

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-12-1 00:05:50 | 显示全部楼层 |阅读模式
    现代计算机一般采用二进制来表示数据,即用0和1的组合来表示各种信息。格雷码是这样一种排列数字的方式,所有相邻整数在它们的二进制表示中只有一个位不同。例如,下面是3bit的格雷码(注意开始和结束的数字也只有一位不同): 000 001 011 010 110 111 101 100
    0      1     3    2     6     7    5    4

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

         
       
      
        两个bit的格雷码通过一个bit的格雷码序列产生:
    (1) 每一个原始序列前面加上"0",得到总数一半的格雷码;
    (2) 把原始序列反序,然后每一个前面加上"1",得到另一半的格雷码,最后放在一起形成两个bit的格雷码:
    00  01  11  10

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

    方法一(循环实现)
    1. import java.util.Scanner;   
    2.   
    3. public class Gray {   
    4.     public static void main(String[] args) {   
    5.         Scanner scanner = new Scanner(System.in);   
    6.         int n = scanner.nextInt();   
    7.         int num = (int)Math.pow(2, n);//根据输入的整数,计算出此Gray序列大小   
    8.         String[] s1 = {"0","1"};//第一个Gray序列   
    9.         for(int i=2;i<=n;i++){//循环根据第一个Gray序列,来一个一个的求   
    10.             int p = (int)Math.pow(2, i);//到了第几个的时候,来计算出此Gray序列大小   
    11.             String[] si = new String[p];   
    12.             for(int j=0;j< p;j++){//循环根据某个Gray序列,来一个一个的求此序列   
    13.                 if(j< (p/2)){   
    14.                     si[j] = "0" + s1[j];//原始序列前面加上"0"   
    15.                 }else{   
    16.                     si[j] = "1" + s1[p-j-1];//原始序列反序,前面加上"1"   
    17.                 }   
    18.             }   
    19.             s1 = si;//把求得的si,附给s1,以便求下一个Gray序列   
    20.         }   
    21.         for(int i=0;i< num;i++){   
    22.             System.out.println(s1[i]);   
    23.         }   
    24.     }   
    25. }  
    复制代码
    方法二(递归实现)
    1. import java.util.Scanner;   
    2.   
    3. public class Gray1 {   
    4.     public static void main(String[] args) {   
    5.         Scanner scanner = new Scanner(System.in);   
    6.         int n = scanner.nextInt();   
    7.         String gray[]=GeLeiMa(n);
    8.          for(int i=0;i< gray.length;i++){   
    9.             System.out.println(gray[i]);   
    10.         }   
    11.     }
    12.    public static String[] GeLeiMa(int n)
    13.     {
    14.         double num=Math.pow(2,n);
    15.         String[] s=new String[(int)num];
    16.         if(n==1)
    17.         {
    18.             s[0]="0";
    19.             s[1]="1";
    20.         }
    21.         else if(n>1)
    22.         {
    23.             String[] tm=GeLeiMa(n-1);
    24.             for(int i=0;i< tm.length;i++)
    25.             {
    26.                 s[i]="0 "+tm[i];
    27.                 s[2*(tm.length)-1-i]="1 "+tm[i];
    28.             }
    29.         }
    30.         return s;
    31.     }
    32. }
    33. 运行:

    34. C:        est>java   Gray1
    35. 1
    36. 0
    37. 1
    38. C:        est>java   Gray1
    39. 2
    40. 0 0
    41. 0 1
    42. 1 1
    43. 1 0
    44. C:        est>java   Gray1
    45. 3
    46. 0 0 0
    47. 0 0 1
    48. 0 1 1
    49. 0 1 0
    50. 1 1 0
    51. 1 1 1
    52. 1 0 1
    53. 1 0 0
    54. C:        est>java   Gray1
    55. 4
    56. 0 0 0 0
    57. 0 0 0 1
    58. 0 0 1 1
    59. 0 0 1 0
    60. 0 1 1 0
    61. 0 1 1 1
    62. 0 1 0 1
    63. 0 1 0 0
    64. 1 1 0 0
    65. 1 1 0 1
    66. 1 1 1 1
    67. 1 1 1 0
    68. 1 0 1 0
    69. 1 0 1 1
    70. 1 0 0 1
    71. 1 0 0 0
    复制代码



      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/12/1/000550406.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:44 , Processed in 0.296515 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表