簡體   English   中英

通過將“0”附加到較小長度的字符串來計算漢明距離

[英]Calculating hamming distance by appending '0' to lesser length string

我必須找到兩個代碼之間的漢明距離。

例如,如果我輸入:

a = 10

b = 1010

通過附加0,自動a應該等於字符串b的長度。

所以輸入應該變成:

一個= 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 string\n");
    scanf("%s",a);
    printf("Enter the second binary string\n");
    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]='\0';

        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]='\0';

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

    printf("\nCodes are\n");
    printf("a=%s\n",a);
    printf("\nb=%s\n",b);

    for(i=0;a[i]!='\0';i++)
    {
        if(a[i]!=b[i])
        {
            count++;
        }
    }

    printf("hammung distance between two code word is %d\n",count);
}

任何人都可以幫我解決這個問題嗎?

在您的兩個for循環中,您將舊選項卡的內容向右移動以插入零,您可以反轉長度。

第一個循環應該是:

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

第二個:

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

嘗試之后:

代碼是

一個= 0010

B = 1010

兩個碼字之間的hammung距離是1

此外,main函數應返回int ,而不是void 如評論中所述,您還應該更改len1len2idiffcountj因為您將它們用作數字值,而不是字符。 例如,您可以使用intsize_t類型。

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

這里有一個方法,它不會將零添加到最短的二進制字符串,並通過直接比較字符串的元素(從最后一個字符開始strtol()來避免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: %s\n", a);
    printf("bstring_2: %s\n", b);
    printf("Hamming distance: %zu\n", 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("%u\n", hammingDistance);   
}

它使用strtoul使用基數2將二進制字符串轉換為unsigned long int ,然后您只需使用按位運算符(xor,和shift)來計算漢明距離而無需考慮大小差異。

顯然,如果要測試值大於unsigned long int的二進制字符串,這種方式就會停止工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM