求最小码距(完整版)

文章描述了一个关于计算机组成原理的问题,涉及到码距的概念,即两个编码在二进制表示下不同的位数。小明需要编写代码来计算给定十六进制编码集合的最小码距,并输出所有编码对之间的码距和不同位。参考代码提供了一个解决方案,通过遍历比较所有编码对并找出最小码距。
摘要由CSDN通过智能技术生成

计算机组成原理老师给小明出了一道求最小码距的题目,有以下由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;
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值