笔试真题-递归方式计算某一正整数n的格雷码(Gray Code )
来源:互联网 发布:域名注册网络公司 编辑:程序博客网 时间:2024/06/15 03:59
1、格雷编码简介
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。例如7的格雷码为0101,8的格雷码为0100,9的格雷码为1100。相邻两个数字的编码只需变动一位。其余普通的二进制编码相比,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。
2、二进制转换为格雷编码方法
从最右边一位起,依次将每一位与左边一位异或(XOR),作为应格雷码该位的值,最左边一位不变(相当于左边是0)。
例如:7(十进制)-->0110(二进制)-->0101(格雷编码)。
第一步:先将7转换为二进制码0110;
第二步:二进制码最后一位0与倒数第二位1进行异或运算即0 xor 1=1,即为格雷码的最后一位;
第三步:以此类推,格雷码的第倒数第n位等于二进制码的倒数第n位与倒数第n+1位进行异或运算,这里n小于二进制码的长度;
第四步:将二进制码的第一位0,作为格雷码的第一位,故得出0110的格雷码为0101。
3、十进制转二进制的递归实现
转换方法这里不再赘述。即先用n对2取商得到b,再 用n对2取余运算,得到余数a。余数a即二进制的倒数第一位字符。再递归使用商b对2取商和取余,直到商为0为止。具体代码如下。
//递归转将十进制换为二进制编码int praseToBinaryCode(int n,vector<int>* list){int b = n / 2;int a = n % 2;if(0 == b){list->push_back(a);int m = list->size()%4;//不足4位前面用0补齐if(m!=0){for(int i = 0;i<4-m;i++){list->push_back(0);}}return 0;}else{list->push_back(a);praseToBinaryCode(b,list);}return 0;}
4、二进制编码转格雷编码的递归实现
利用2中阐述的方法很容易实现二进制转格雷编码:
//递归转换为格雷编码int praseToGrayCode(int bCode[], int grayCode[], int i ,int len){if(i>=len-2){grayCode[i] = bCode[i] ^ bCode[i+1];grayCode[i+1] = bCode[i+1];return 0;}else{grayCode[i] = bCode[i] ^ bCode[i+1];praseToGrayCode(bCode,grayCode,i+1,len);}return 0;}
5、所有代码及程序运行效果
全部代码如下,直接给出来了:
// GrayCode.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <vector>using namespace std;//递归转换为格雷编码int praseToGrayCode(int bCode[], int grayCode[], int i ,int len){if(i>=len-2){grayCode[i] = bCode[i] ^ bCode[i+1];grayCode[i+1] = bCode[i+1];return 0;}else{grayCode[i] = bCode[i] ^ bCode[i+1];praseToGrayCode(bCode,grayCode,i+1,len);}return 0;}//递归转将十进制换为二进制编码int praseToBinaryCode(int n,vector<int>* list){int b = n / 2;int a = n % 2;if(0 == b){list->push_back(a);int m = list->size()%4;//不足4位前面用0补齐if(m!=0){for(int i = 0;i<4-m;i++){list->push_back(0);}}return 0;}else{list->push_back(a);praseToBinaryCode(b,list);}return 0;}void print(int* p,int len){for(int i = len-1;i>=0;i--){int c = p[i];printf("%d",c);}printf("\n");}int _tmain(int argc, _TCHAR* argv[]){while(1){int n;cout<<"请输入任意正整数:";cin>>n;vector<int> bCodeList;praseToBinaryCode(n,&bCodeList);int size= bCodeList.size();int* bCode = new int[size];for(int i =0;i<size;i++){int c = bCodeList.at(i);bCode[i]=c;} cout<<"binay Code is:";print(bCode,size);int* grayCode = new int[size];praseToGrayCode(bCode,grayCode,0,size);cout<<"Gray Code is:";print(grayCode,size);delete[] bCode;delete[] grayCode;}return 0;}
运行效果如下:
算法有不懂得地方可以参考下面的这篇文章:
http://blog.sina.com.cn/s/blog_6d30f67301017tv7.html
里面还包括格雷编码的解码方法。
0 0
- 笔试真题-递归方式计算某一正整数n的格雷码(Gray Code )
- Java 递归实现格雷码(Gray Code)
- 递归——生成格雷码(gray code)
- **(leetcode_backtracking,递归) Gray Code
- [LeetCode]—Gray Code 计算格雷码
- 【位计算】Gray Code
- 格雷码(Gray Code)的生成
- 【Leetcode】89. Gray Code 【递归】
- 笔试题:计算N的阶乘
- 递归生成格雷码 gray code generation using recursion(c++)
- Gray code 的学习
- [LeetCode] 格雷码(Gray Code)
- Gray Code 格雷码 @LeetCode
- Gray Code 格雷码编码
- leetcode Gray Code 格雷码
- Gray Code 格雷码
- 格雷码(gray code)
- LeetCode-Gray Code(格雷码)
- MySQL存储引擎--存储引擎的选择
- mybatis的学习
- cocos studio 执行命令出错,返回值:2。
- jar学习3
- BestCoder Round #77 1002.xiaoxin juju needs help(HDU5651)
- 笔试真题-递归方式计算某一正整数n的格雷码(Gray Code )
- Raspberry Pi Samba(Share Files With Mac OS)
- 自定义下拉刷新的listview
- C# partial部分类的使用
- Android 开源框架Universal-Image-Loader---源代码解读
- 数据库触发器
- 分治法-最近对问题
- 中小型web架构
- 郭沫若《斥反动文艺》