1. 程式人生 > >求兩個整數之間的漢明距離-salem

求兩個整數之間的漢明距離-salem

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.

Example
Input

2
2
12
5
3
1
2
3

Output

2
2

題目大意:
給你任意個整數,然後求出這些整數中漢明距離最大的一對數並輸出距離。

解題思路:
所謂漢明距離就是給定兩個相同長度的字串,找出字串中相同位置不同值的元素個數。
在這個題目中使用到二進位制的異或運算,因為異或的規則是兩個數相同為0,不同為1,所以只需將兩個數進行異或運算再求出其結果整數的二進位制數中1的個數即可。
而計算

一個二進位制中1的個數可以使用:
計算機裡的數字本來就是用二進位制存的,所以計算過程也都是二進位制計算。利用一些位運算的特性,可以很容易計算1的個數。

有一個很有意思的特性:隨便給一個二進位制數,比如n=10001100,我們把它減一:n-1=10001011。重新擺放一下觀察:
10001100 (n)
10001011 (n-1)
通過觀察得出,n中為1的最低位是第3位,而n-1和n的低3位全都不同。如果進行“按位與”操作,即 n & (n-1) = 10001000。
10001100 (n)
10001011 (n-1)
10001000 (n & (n-1))
可以看到底3位都變成了0。
如果你數學足夠好,可以得出結論:

[結論]要消除整數n最低位的1,可以使用 n = n & (n-1)。

所以程式碼為:

int check(int n)
{
    int c=0;
    while(n)
    {
        n=n&(n-1);
        c++;
    }
    return c;
}

此題程式碼為:

#include<iostream>
#include<cstdio>
using namespace std;
int check(int n)
{
    int c=0;
    while(n)
    {
        n=n&(n-1);
        c++;
    }
    return c;
}
int main()
{
    int n;
    int a[105];
    cin>>n;
    while(n--)
    {
        int n1;
        cin>>n1;
        int maxx=0;
        for(int i=1;i<=n1;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n1;i++)
        {
            for(int j=i+1;j<=n1;j++)
            {
                int m=check(a[i]^a[j]);
//                cout<<"m: "<<m<<endl;
                if(m>maxx)
                    maxx=m;
            }
        }
        cout<<maxx<<endl;
    }
}