c语言 - 通过将'0'附加到较小长度的字符串来计算汉明距离



>我必须找到两个代码之间的汉明距离。

例如,如果我输入:

a= 10

b= 1010

通过附加 0 自动使 a 等于字符串 b 的长度。

所以输入应该变成:

a=0010

b=1010

但我得到的却是:

a = 001010

b = 1010

这是我的代码:

#include<stdio.h>
#include<string.h>
void main()
{
    char a[20],b[20],len1,len2,i,diff,count=0,j;
    printf("Enter the first binary stringn");
    scanf("%s",a);
    printf("Enter the second binary stringn");
    scanf("%s",b);
    len1 = strlen(a);
    len2 = strlen(b);
    if(len1>len2)
    {
        diff = len1-len2;
        for(i=0;i<len1;i++)
        {
            b[i+diff]=b[i];
        }
        j=i+diff;
        b[j]='';
        for(i=0;i<diff;i++)
        {
            b[i]='0';
        }
    }
    else
    {
        diff = len2-len1;
        for(i=0;i<len2;i++)
        {
            a[i+diff]=a[i];
        }
        j=i+diff;
        a[j]='';
        for(i=0;i<diff;i++)
        {
            a[i]='0';
        }
    }
    printf("nCodes aren");
    printf("a=%sn",a);
    printf("nb=%sn",b);
    for(i=0;a[i]!='';i++)
    {
        if(a[i]!=b[i])
        {
            count++;
        }
    }
    printf("hammung distance between two code word is %dn",count);
}

谁能帮我解决这个问题?

在将旧选项卡的内容向右移动以插入零的两个for循环中,您反转了长度。

第一个循环应该是:

for(i=0;i<len2;i++)
{
    b[i+diff]=b[i];
}

第二:

for(i=0;i<len1;i++)
{
    a[i+diff]=a[i];
}

尝试后:

代码是

a=0010

b=1010

两个码字之间的距离为1

此外,main 函数应该返回一个int,而不是void。如注释中所述,您还应该更改len1的类型,len2idiffcountj,因为您将它们用作数字值,而不是字符。例如,您可以使用intsize_t类型。

int main()
{
    char a[20],b[20];
    int len1, len2, i, diff, count=0, j;
    // Rest of your code
}

这是一个方法,它不会在最短的二进制字符串前面加上零,并通过直接比较字符串的元素(从最后一个字符开始(来避免strtol()的限制。使用strtol()的复杂性换来了处理数组索引的复杂性。请注意,必须注意避免倒计时到负值,因为使用了size_t类型。这种方法不受long类型容量的限制,而是受size_t的限制。

#include <stdio.h>
#include <string.h>
int main(void)
{
    char a[20], b[20];
    printf("Enter first binary string: ");
    scanf("%19s", a);
    printf("Enter second binary string: ");
    scanf("%19s", b);
    size_t a_len = strlen(a);
    size_t b_len = strlen(b);
    size_t max_len = a_len > b_len ? a_len : b_len;
    size_t hamming_dist = 0;
    for (size_t i = 0; i < max_len; i++) {
        if (a_len - i > 0 && b_len - i > 0) {
            if (a[a_len - i - 1] == b[b_len - i - 1]) {
                continue;
            }
        }
        if ((a_len - i > 0 && a[a_len - i - 1] == '1') ||
            (b_len - i > 0 && b[b_len - i - 1] == '1')) {
            ++hamming_dist;
        }
    }
    printf("bstring_1: %sn", a);
    printf("bstring_2: %sn", b);
    printf("Hamming distance: %zun", hamming_dist);
    return 0;
}

一种不需要用零填充其中一个参数的方法:

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    char *a = "1010";
    char *b = "10";
    long unsigned int xorab;
    unsigned int hammingDistance = 0;
    xorab = strtoul(a, NULL, 2) ^ strtoul(b, NULL, 2);
    while (xorab) {
        hammingDistance += xorab & 1;
        xorab >>= 1;
    }
    printf("%un", hammingDistance);   
}

它使用 strtoul 将二进制字符串转换为以 2 为底的二进制字符串unsigned long int,然后您只需使用按位运算符(xor 和 shift(来计算汉明距离,而无需处理大小差异。

显然,如果您想

测试值大于无符号长整型的二进制字符串,这种方式将停止工作。

最新更新