>我必须找到两个代码之间的汉明距离。
例如,如果我输入:
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
的类型,len2
,i
,diff
,count
和j
,因为您将它们用作数字值,而不是字符。例如,您可以使用int
或size_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(来计算汉明距离,而无需处理大小差异。
测试值大于无符号长整型的二进制字符串,这种方式将停止工作。