题目描述
给出n个数,求这n个数中两两最大的汉明距离,两个数的汉明距离定义维两个二进制表示中不同的位数。
例如11和6的汉明距离为3,因为11转换为二进制后为1011,6转换为二进制后为0110,他们的二进制第1,3,4位(从低位开始数)不同
输入
第一行一个数n,代表有n个数,接下来n个数,描述这n个数a1,a2,a3,..an;
1<=n<=100,1<=ai<=10000
输出
一个数,最大的汉明距离
#include<stdio.h>
#define N 100
#define M 32
int TenToTwo(int a);
int main(void)
{
int A[N][M]={0},a[N]; //A[N][M]存放二进制数
int B[1000][32]={0}; //存放两两比较的汉明距离
int i,j,k,n;
int m=0;
scanf("%d
",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
j=0;
while(a[i]>0)
{
A[i][j]=a[i]%2;
a[i]=a[i]/2;
j++;
}
m=j;
}
{
for(j=i+1;j<n;j++)
{
int h=0;
for(k=0;k<m;k++)
{
if(A[i][k]!=A[j][k])
{
h++;
}
}
B[i][j]=h;
}
}
/*
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",B[i][j]);
}
printf("
");
}
*/
int max=B[0][0];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(max<B[i][j])
{
max=B[i][j];
}
}
}
printf("%d
",max);
return 0;
}