计算机组成原理老师给小明出了一道求最小码距的题目,有以下由1个字节组成的合法编码集{0xA9,0xC7,0xDF,0xBE},该编码集的最小码距是__
小明知道码距,也知道最小码距的概念。码距是指信息编码中,两个合法编码对应位上编码不同的位数,比如10101和00110从第1位开始依次有第1位、第4、第5位不同,因此码距为3**,任意组合的码距最小值称为最小码距。
小明想借助计算机帮忙自己算出答案,今后无论老师出何种组合,他都能一键运行答案,于是他开始了最小码距的代码编写。
输入格式:
第一行读入1个整数N(2≤N≤8),代表需要输入的编码个数。
第二行输入N个编码(用十六进制表示,编码位数≤8),中间用空格隔开。
输出格式:
1.根据用户输入编码的顺序依次进行比较,每一行两两编码间的码距以及具体哪几位不一样(最低位为第1位)
输出有两种格式:
(1)当码距>0时,需要输出具哪几位不一样(如:0x2 0x1 CD:2,bit:1|2|)
(2)当码距=0时,只需要输出前半段(如0x2 0x2 CD:0)
2.最后一行数据输出最小码距
3.其他要求:输出所有编码时都需要加前缀0x,如0x0
输入样例:
在这里给出一组输入。例如:
4
0xa9 0xc7 0xdf 0xbe
6
0xa9 0xc7 0xdf 0xbe 0xbe 0x0
输出样例:
在这里给出相应的输出。例如:
0xa9 0xc7 CD:5,bit:2|3|4|6|7|
0xa9 0xdf CD:5,bit:2|3|5|6|7|
0xa9 0xbe CD:4,bit:1|2|3|5|
0xc7 0xdf CD:2,bit:4|5|
0xc7 0xbe CD:5,bit:1|4|5|6|7|
0xdf 0xbe CD:3,bit:1|6|7|
The MinCD is 2
0xa9 0xc7 CD:5,bit:2|3|4|6|7|
0xa9 0xdf CD:5,bit:2|3|5|6|7|
0xa9 0xbe CD:4,bit:1|2|3|5|
0xa9 0xbe CD:4,bit:1|2|3|5|
0xa9 0x0 CD:4,bit:1|4|6|8|
0xc7 0xdf CD:2,bit:4|5|
0xc7 0xbe CD:5,bit:1|4|5|6|7|
0xc7 0xbe CD:5,bit:1|4|5|6|7|
0xc7 0x0 CD:5,bit:1|2|3|7|8|
0xdf 0xbe CD:3,bit:1|6|7|
0xdf 0xbe CD:3,bit:1|6|7|
0xdf 0x0 CD:7,bit:1|2|3|4|5|7|8|
0xbe 0xbe CD:0
0xbe 0x0 CD:6,bit:2|3|4|5|6|8|
0xbe 0x0 CD:6,bit:2|3|4|5|6|8|
The MinCD is 0
参考代码:
#include<stdio.h>
typedef long long ll;
int main(void)
{
/**
* 题目说最多会有 8 个编码位数,也就是 4 个字节
* 如果使用 int 刚好四个字节,需要考虑符号问题,数据范围开 long long
*/
int n;
ll num[10];
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
// 用 %llx 读入一个 长整型的十六进制数
scanf("%llx", &num[i]);
}
// 用 ans 记录 最小码距
int ans = 100;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
// 每次取出两个数,用 a,b 记录
// bit 数组 记录 二进制不相同的位置
ll a = num[i], b = num[j];
int idx = 0, bit[100], cnt = 1;
while (a > 0 || b > 0) {
if ((a & 1) != (b & 1)) {
bit[idx++] = cnt;
}
a >>= 1;
b >>= 1;
++cnt;
}
// 按要求输出两个数以及两个数不相同的位置
if (ans > idx) ans = idx;
printf("0x%llx 0x%llx CD:%d", num[i], num[j], idx);
// 这里需要特判一下,如果两个数相等,就不需要输出后面的 bit 了
if (idx) printf(",bit:");
for (int k = 0; k < idx; ++k) {
printf("%d|", bit[k]);
}
printf("\n");
}
}
printf("The MinCD is %d", ans);
return 0;
}