格雷码 hnustoj

来源:互联网 发布:淘宝颜色分类自定义 编辑:程序博客网 时间:2024/06/07 06:38

1004: 格雷码

时间限制: 1 Sec  内存限制: 128 MB
提交: 274  解决: 96
[提交][状态][讨论版]

题目描述

对于给定的正整数n,格雷码为满足如下条件的一个编码序列:
(1) 序列由2^n个编码组成,每个编码都是长度为n的二进制位串。
(2) 序列中无相同的编码。
(3) 序列中位置相邻的两个编码恰有一位不同。
例如:n=2时的格雷码为:{00, 01, 11, 10}。

输入

m个测试例的数据,每个测试例的数据由一个正整数n(n <= 20) 组成,以0结束。

输出

对于每个测试例n,输出2^n个长度为n的格雷码。(为方便查看,在每个格雷码内,两个位之间没有空格如,00输出为:00)。两个测试例的输出数据之间用一个空行隔开,最后一个测试例后两个空行。

样例输入

450

样例输出

00000001001100100110011101010100110011011111111010101011100110000000000001000110001000110001110010100100011000110101111011100101001011010010100011000110011101111010111101111111101111001010010101101111011010010100111000110000

提示

#include<vector>#include<iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long LL;int number[30];void change(int n,int len) {    int p;    int i=0;    memset(number,0,sizeof(number));    while(n) {        p=n%2;        number[i++]=p;        n/=2;    }    for(int i=len-1; i>=0; i--) {        printf("%d",number[i]);    }}int main() {    int n;    while(~scanf("%d",&n) && n) {        vector<int> v;        v.clear();        for(int i=0; i<(1<<n); i++) v.push_back(i^(i>>1));        vector<int> ::iterator it;        for(it=v.begin(); it!=v.end(); it++) {            change(*it,n);            printf("\n");        }        printf("\n");    }}

格雷码与二进制的转换具体可以看http://blog.csdn.net/jingfengvae/article/details/51691124


原创粉丝点击