求两个整数之间的汉明距离---Salem

B - Salem
Time Limit:1000MS Memory Limit:1048576KB 64bit IO Format:%I64d & %I64u
Submit

Status

Practice

Gym 100814I
Description
standard input/output
Statements
Salem is known to be one of the best competitive programmers in the region. However, he always finds a hard time understanding the concept of the hamming distance. The hamming distance of two numbers is defined as the number of different digits in their binary representations (leading zeros are used if necessary to make the binary representations have the same length). For example the hamming distance between 12 and 5 is 2 since their binary representations are 1100 and 0101 respectively and they differ in the first and fourth positions.

Recently, Salem got a problem that he needs your help to solve. He is given N integers and asked to get the maximum among the hamming distances of all possible pairs of the given integers.

Input
The first line of the input will be a single integer T representing the number of test cases. Followed by T test cases. Each test case will start with a line with single integer (2 ≤ N ≤ 100) representing the number of the integers. Each of the following N lines contains one of the integers (1 ≤ Ai ≤ 10, 000) from the list of the integers.

Output
For each test case print one line consists of one integer representing the maximum hamming distance between all possible pairs from the given integers.

Sample Input
Input
2
2
12
5
3
1
2
3
Output
2

题目大意:
给你任意个整数,然后求出这些整数中汉明距离最大的一对数并输出距离。
解题思路:
所谓汉明距离就是给定两个相同长度的字符串,找出字符串中相同位置不同值的元素个数。
在这个题目中使用到二进制的异或运算,因为异或的规则是两个数相同为0,不同为1,所以只需将两个数进行异或运算再求出其结果整数的二进制数中1的个数即可。

求一个整数其二进制数中1的个数可以使用快速法:

int BitCount(int n)
{
     int c =0 ;
    for (c =0; n; ++c)
    {
        n &= (n -1) ; // 清除最低位的1
    }
    return c;
}

具体代码如下:

#include <iostream>
#include <cstdio>
#include <cstring> 
using namespace std;
const int MAXN=105;
int a[MAXN];
int BitCount(int n)
{
     int c =0 ;
    for (c =0; n; ++c)
    {
        n &= (n -1) ; // 清除最低位的1
    }
    return c;
}
int main()
{
    int T;
    cin>>T;
    int N;
    while(T--)
    {
        int max=0;
        memset(a,0,sizeof(0));
        cin>>N;
        scanf("%d",&a[0]);
        for(int i=1;i<N;i++)
        {
            scanf("%d",&a[i]);
            for(int j=0;j<i;j++)
            {
                int maxw=BitCount(a[i]^a[j]);
                if(maxw>max)
                {
                    max=maxw;
                }
            }
        }
        cout<<max<<endl;
    } 
    return 0;
}

仅代表个人观点,欢迎交流探讨,勿喷~~~
这里写图片描述

PhotoBy:WLOP

http://weibo.com/wlop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值