金色十月線上程式設計比賽第二題:解密

jsjliuyun發表於2014-10-21

題目詳情:

小強是一名學生, 同時他也是一個黑客。 考試結束後不久,他驚訝的發現自己的高等數學科目居然掛了,於是他果斷入侵了學校教務部網站。在入侵的過程中,他發現了與成績相關的內容是一個加密檔案,這個檔案由 n 個數構成,經過分析,這個加密檔案的金鑰為這 n 個數中二進位制位數 1 最少的數。但由於數比較多,小強 希望你能幫他得到金鑰,好在成績公佈之前將成績改過來。

輸入描述:

輸入由多組資料構成,每組資料第一行為一個數 n(1<=n<=10^5),表示數的數量,第二行 n 個整數表示檔案中的每個數(1<=每個數<=10^9)。以檔案結尾。

輸出描述:

對於每組資料輸出一行,先輸出資料組數,再輸出二進位制中含 1 最少的數,如果有多個數符合條件,輸出最小的那個。



答題說明:

輸入樣例:

5

3 2 4 5 6

輸出樣例:

Case 1: 2


解析:這道題題目比較清晰,而且沒有涉及什麼演算法類的,唯一的就是求一個整數中二進位制1的個數,這個方法實在是太多了,最簡單的就是移位,然後累計即可,剩下的就是邏輯判斷了。

但是感覺較坑的是,提交了四次才挑戰成功,原來一直是輸出時,Case和1之間有空格,冒號和2之間也有空格,坑。。。。

貼下自己的程式碼

#include<iostream>
using namespace std;
int BitCount(unsigned int n)
{
    unsigned int c =0 ;
    for (c =0; n; ++c)
    {
        n &= (n -1) ; // 清除最低位的1
    }
    return c ;
}
int main()
{
	int n,m,mincount,minnumber,T=1;
	while(cin >> n)
	{
		//輸入n個整數
		for(int i=0; i<n; ++i)
		{
			cin >> m;
			//求m的二進位制中整數的個數
			int count=BitCount(m);
			//第一次對mincount,minnumber進行初始化
			if(i==0)
			{
				mincount=count;
				minnumber=m;
			}else{
			//判斷並更新最小的值和最小二進位制中1的個數
			if(count<mincount || (count==mincount && m<minnumber))
			{
				minnumber=m;
				mincount=count;
			}
			}
		}
		//輸出Case
		cout << "Case " << T << ": "<< minnumber << endl;
		T++;
	}
}


相關文章