解密

解密


描述:

小强是一名学生, 同时他也是一个黑客。 考试结束后不久,他惊讶的发现自己的高等数学科目居然挂了,于是他果断入侵了学校教务部网站。

在入侵的过程中,他发现了与成绩相关的内容是一个加密文件,这个文件由 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;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值