海明码检验和纠错
2017-05-04 17:53
218 查看
/* 海明码检验与纠错. */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; /* 测试样例 110010100000 0011101 1110110 011001011001 0001001 */ char s[105]; // 用来接收信息位字符串 char ans[1005]; //得出的海明码存储在这里 const int hehe[] = {1,2,4,8,16,32,64,128,256,512,1024}; //这个办法真是呵呵了。。。。 const int hehe_len = sizeof(hehe) / sizeof(int); //呵呵数组的长度,懒得算 int r_len; //校验位的位数 int k; //信息位个数 int step; //在海明码中信息位的最高下标。 int s1[105]; int s1_len; struct Node { int a[10]; //存储ri是由谁生成的(存下标) int len ; //a数组的长度 int val; //校验位的值 } r[105]; int pow(int b,int r_len) //幂运算 { int ret = 1; for(int i = 1; i <= r_len; ++i) ret *= b; return ret; } bool findPos(int n) //找到hehe中的数 { for(int i = 0; i < hehe_len; ++i) if(hehe[i] == n) return true; return false; } int f(char c) //char -> int { return c - '0'; } int zh() { int ret = 0; for(int i = 0;i < r_len;++i) if(s1[i]) ret += pow(2,i); return ret; } void solve() { int len_n = strlen(s + 1); for(k = len_n;k >= 0;--k) if(pow(2,len_n - k) >= len_n + 1) { r_len = len_n - k; break; } memset(ans,-1,sizeof ans); memset(r,0,sizeof r); for(int i = 1,j = len_n; i <= j; ++i,--j) //逆序字符串,以便对应I1,I2.... { char t = s[i]; s[i] = s[j]; s[j] = t; } //printf("%s\n",s); r_len = 0; for(int i = 1;i <= len_n;++i) { if(findPos(i)) { r[r_len++].val = f(s[i]); } } int i; for(step = 3,i = 1;i <= len_n;) { if(!findPos(step)) { if(findPos(i))++i; else ans[step++] = s[i++]; } else step++; } //printf("step = %d\n",step); for(int j = step - 1; j >= 3; --j) // 找出ri是由哪几位在一起生成的. { if(!findPos(j)) { int t = j; for(int l = hehe_len - 1; l >= 0 && t > 0; --l) { if(t >= hehe[l]) { t -= hehe[l]; r[l].a[r[l].len++] = j; } } } } for(int i = 1,j = 0;i <= max(step - 1,pow(2,r_len - 1));++i) { if(findPos(i)) { ans[i] = r[j++].val + '0'; } } s1_len = 0; for(int i = 0;i < r_len;++i) { s1[i] = r[i].val; for(int j = 0;j < r[i].len;++j) { s1[i] = s1[i] ^ f(ans[r[i].a[j]]); } } int pos = zh(); if(pos == 0) { printf("这个海明码没有错误!\n"); } else { ans[pos] == '0' ? ans[pos] = '1' : ans[pos] = '0'; printf("第%d位出现错误,改正后如下\n",pos); for(int i = max(step - 1,pow(2,r_len - 1));i >= 1 ;--i) printf("%c",ans[i]); printf("\n"); } } int main(){ while(~scanf("%s",s + 1)) solve(); return 0; }
相关文章推荐
- 史上最通俗的海明码编码计算、检错和纠错原理解析
- ECC检验与纠错
- 史上最通俗的海明码编码计算、检错和纠错原理解析
- 海明码及其纠错原理
- 海明码的纠错过程
- 计算机组成.其实机器也会出错.错误检验与纠错的数据编码
- 海明码计算及其纠错原理-网络文摘总结
- 史上最通俗的海明码编码计算、检错和纠错原理解析
- 改变DBGrid列的颜色,没什么特别,但是经过调色师检验欧!
- 通过探测邮件服务器进行Email地址有效性检验
- 用六大代码问题检验你的Java知识能力
- Release版才出现的错误如何纠错
- 病毒代码检验你的杀毒软件质量
- ASP.NET检验控件的汇总
- 检验输入数据是否重复函数(SQL Server)
- 基本路由器的检验命令
- 用户需要——检验网站成功与否的标准
- MSXML使用技巧:用指定的SCHEMA检验XML
- fjnu 1738 括号匹配检验
- JS检验日期格式