解密
描述:
小强是一名学生, 同时他也是一个黑客。 考试结束后不久,他惊讶的发现自己的高等数学科目居然挂了,于是他果断入侵了学校教务部网站。
在入侵的过程中,他发现了与成绩相关的内容是一个加密文件,这个文件由 n 个数构成,经过分析,这个加密文件的密钥为这 n 个数中二进制位数 1 最少的数。
但由于数比较多,小强 希望你能帮他得到密钥,好在成绩公布之前将成绩改过来。
输入:
输入由多组数据构成,每组数据第一行为一个数 n(1<=n<=10^5),表示数的数量,第二行 n 个整数表示文件中的每个数(1<=每个数<=10^9)。以文件结尾。
输出:
对于每组数据输出一行,先输出数据组数,再输出二进制中含 1 最少的数,如果有多个数符合条件,输出最小的那个。
样例输入:
5
3 2 4 5 6
样例输出:
Case 1: 2
Answer:
求二进制数中1的个数有许多方法,http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html 。
提交失败N次,后来才发现冒号后还有个空格!
另外需要注意的是,如果二进制中1的个数一样,输出较小的数。
实现代码:
#include <iostream>
using namespace std;
int BitCount(int n)
{
unsigned int count = 0;
while (n > 0)
{
if ((n & 1) == 1)
count++;
n =n>>1;
}
return count;
}
int main()
{
int n, step = 0;
while (cin >> n)
{
int tmp, num, min = 0xffffff;
for (int i = 0; i<n; i++)
{
cin >> tmp;
if (min > BitCount(tmp))
{
min = BitCount(tmp);
num = tmp;
}
else if (min == BitCount(tmp) && num>tmp)
{
min = BitCount(tmp);
num = tmp;
}
}
step++;
cout << "Case " << step << ": " << num << endl;
}
return 0;
}