要求输入一串七位二进制数,同时换行输入其奇偶性配置(2表示按偶性配置,1表示按奇性配置)。最后换行输出其结果。
输入样例1 | 1100000 2 |
输出样例1 | 1000 |
输入样例2 | 1000000 1 |
输出样例2 | 0010 |
.... |
首先,要知道海明码只能纠错一位。
而奇偶配置,即检验位通过置0或置1,来使对应的一组信息位中1的数量为奇数或者偶数。例如,七位偶数配置的海明码中,c1、c3、c5、c7中1的数量为偶数。
#include <stdio.h>
int main()
{
int in;
scanf("%d", &in);//输入海明码
int array[8];//海明码的七位,从下标1开始
for (int j = 7; j>0; j--) {
array[j] = in % 10 ;
in = in / 10;
}
int odevity;
scanf("%d", &odevity);//输入奇偶配置,奇为1,偶为2或0
int out[5];//欲求的传送码
out[3] = array[6];
out[2] = array[5];
out[1] = array[3];
out[4] = (array[1] + array[2] + array[4] + odevity) % 2;
//判断检验位是否符合配置
int x1 = array[1] == (array[3] + array[5] + array[7] + odevity) % 2;
int x2 = array[2] == (array[3] + array[6] + array[7] + odevity) % 2;
int x4 = array[4] == (array[5] + array[6] + array[7] + odevity) % 2;
if (out[4] == array[7]) {
if (x1) {
//c1正确,c2错误->c6错误
if (!x2) out[3] = (array[6] + 1) % 2;
}//c1,c2都正确时,c3一定正确(假设只有一位出现错误)
else {
if (x2){
//c1错误,c2正确->c5错误
out[2] = (array[5] + 1) % 2;
}
else {
//c1、c2错误时,c3一定正确->c3错误
out[1] = (array[3] + 1) % 2;
}
}
}
for (int i = 1; i < 5; i++)
printf("%d", out[i]);
return 0;
}