Binary Number(位运算)
#include<bits/stdc++.h> using namespace std; int n; int getBits1(int n)//求取一个数的二进制形式中1的个数. { int res=0; while(n) { if(n&1) res++; n>>=1; } return res; } int getBits2(int n) { int res=0; while(n) { res++; n=n&(n-1);//一次消去1个1哦 } return res; } int main() { while(cin>>n) { cout<<getBits1(n)<<" "<<getBits2(n)<<endl; } return 0; } // 1= 1 1 // 2= 10 1 // 3= 11 2 // 4=100 1
题目:
For 2 non-negative integers x and y, f(x, y) is defined as the number of different bits in the binary format of x and y. For example, f(2, 3)=1,f(0, 3)=2, f(5, 10)=4. Now given 2 sets of non-negative integers A and B, for each integer b in B, you should find an integer a in A such that f(a, b) is minimized. If there are more than one such integer in set A, choose the smallest one.
输入:
The first line of the input is an integer T (0 < T ≤ 100), indicating the number of test cases. The first line of each test case contains 2 positive integers m and n (0 < m, n ≤ 100), indicating the numbers of integers of the 2 sets A and B, respectively. Then follow (m + n) lines, each of which contains a non-negative integers no larger than 1000000. The first m lines are the integers in set A and the other n lines are the integers in set B.
输出:
For each test case you should output n lines, each of which contains the result for each query in a single line.
样例输入:
2 2 5 1 2 1 2 3 4 5 5 2 1000000 9999 1423 3421 0 13245 353
样例输出:
1 2 1 1 1 9999 0
#include<bits/stdc++.h> using namespace std; int f(int n) { int res=0; while(n) { res++; n=n&(n-1); } return res; } int main() { int a[105]; int T,n,m,i,j,k,minn,b,t; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<m;i++) { scanf("%d",&b); minn=f(a[0]^b); k=0; for(j=1;j<n;j++) { t=f(a[j]^b); if(minn>t || minn==t&&a[k]>a[j]) { minn=t; k=j; } } printf("%d\n",a[k]); } } return 0; }