美团笔试-第二题最大汉明距离:

题目描述

  给出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;
}

原文地址:https://www.cnblogs.com/sbb-first-blog/p/12897766.html