• 2017.11.24 算法分析与设计------Gay格雷码


    1. 格雷码问题:

    对于给定的正整数n,格雷码为满足如下条件的一个编码序列:
    (1) 序列由2n个编码组成,每个编码都是长度为n的二进制位串。
    (2) 序列中无相同的编码。
    (3) 序列中位置相邻的两个编码恰有一位不同。
    例如:n=1时的格雷码为:{0, 1}。
    n=2时的格雷码为:{00, 01, 11, 10}。
    n=3时的格雷码为:{000, 001, 011, 010,110,111,101,100}。
    gray码问题求解思想:
    将一个规模n位gray码序列表示为G(n), G(n)以相反顺序排列的序列表示为G’(n)。则gray码的构造规则即子问题的划分规则为:G(n+1)= 0G(n) 1G’(n) 。
    gray码问题代码:G(n+1)= G(n) 0G’(n)1

    #include <stdio.h>
    #define N 1000
    int num[N];
    void gray(int n)
    {
        int k,i;
        if(n==1)
        {num[0]=0;num[1]=1;return;}
        gray(n-1);
        k=1<<(n-1);
        for(i=0;i<k;++i)
            num[i+k]=num[k-1-i]+k;
    }
    void out(int n)
    {
        int k,i,j,m;
        int count=0;
        k=1<<n;
        for(i=0;i<k;++i)
        {
            count++;
            //printf("%d ",count);
            if(count>8)
            {
                //printf("%d",count);
                printf("
    ");
                count=1;
            }
            for(j=n;j>0;--j)
            {
                m=1<<(j-1);
                //printf("%d %d
    ",m,num[k]);
                if(num[i]>=m)
                {
                    printf("1");
                    num[i]-=m;
                }
                else printf("0");
            }
            printf(" ");
        }
    }
    void out2(int n)
    {
        int k,i;
        k=1<<n;
        for(i=0;i<k;++i)
            printf("%d ",num[i]);
        printf("
    ");
    }
    int main()
    {
        int n;
        while(scanf("%d",&n),n)
        {
            gray(n);
            out(n);
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    专用学习笔记
    百度地图API试用--(初次尝试)
    学习进度条
    AAAA
    HBase集成(准备篇)
    软件工程学期总结
    【操作系统】实验四 主存空间的分配和回收
    《构建之法》8、9、10章
    金融计算器app的下载情况
    操作系统 实验三 进程调度模拟程序
  • 原文地址:https://www.cnblogs.com/qichunlin/p/7892578.html
Copyright © 2020-2023  润新知