SDUT OJ 2616 简单计算

简单计算

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

某天,XX YY 出了一道题,题目是:

给出n 个十进制的数,找出这n 个数的二进制表示中1 的个数最少的数。

由于YY 的计算能力很差,所以他想让你帮他写个程序来计算出来。

输入

 

输入的第一行为一个正整数T(1 T20),代表测试数据组数。

对于每组测试数据:

输入的第一行为一个正整数n (1 n 105)

第二行为n 个正整数A1A2An1 Ai 109)。

输出

 

每组数据输出一行,先输出数据组数,再输出二进制中含1 最少的数,如果有多个数符合条件,输出最小的那个。具体输出格式见样例输出。

示例输入

2
5 
3 2 4 5 6
4
3 4 2 5

示例输出

Case 1: 2
Case 2: 2

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
int a[100004];

int BitCount2(unsigned int n) 
{
    unsigned int c =0 ;
    for (c =0; n; ++c)
    {
        n &= (n -1) ; // 清除最低位的1
    }
    return c ; //返回 该十进制数转换为二进制后中1的个数
}

int main()
{
    int t;
    int i,j, k=1;
    int n;
    int dd, min, cc;

    cin>>t;

    while(t--)
    {
        cin>>n;

        cin>>a[0];
        min=BitCount2( a[0] );
        cc=a[0];

        for(i=1; i<n; i++)
        {
            cin>>a[i];
            dd=BitCount2(a[i]);
            if(dd<min )
            {
                min=dd;
                cc=a[i];
            }
            else if(dd==min)
            {
                if(a[i]<cc)
                  cc=a[i];
            }
        }
        cout<<"Case "<<k++<<": "<<cc<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yspworld/p/4011627.html