第二届省赛 A:简单计算

Problem A: 简单计算

Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 65 Solved: 39
[Submit][Status][Web Board]
Description

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

Input

输入的第一行为一个正整数T(1≤T≤20),代表测试数据组数。
对于每组测试数据,输入的第一行为一个正整数n(1≤n≤100000),第二行为n个正整数A1、A2、…、An(1≤Ai≤10^9),每个数之间以空格分隔。

Output

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

Sample Input

2
5
3 2 4 5 6
4
3 4 2 5
Sample Output

Case 1: 2

Case 2: 2


刚接触到STL,刚开始用的是优化,调的函数接口,不过 第一个是WA的代码,下一个是AC的代码。


#include <iostream>
#include <cstdio>
#include <memory.h>
#include <stdlib.h>
using namespace std;
div_t temp;
int main(void)
{
    //freopen("A.txt","r",stdin);
    int t;
    scanf("%d",&t);
    int k=1;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int minnnum=9999999999;
        int minnum=9999999999;
        int num;
        for(int i=1;i<=n;i++)
        {
            int m;
            num=0;
            scanf("%d",&m);
            temp=div(m,2);
            if(temp.quot==1&&temp.rem==1) num++;
            while(temp.quot!=1)
            {
                if(temp.rem==1) num++;
                temp=div(temp.quot,2);
            }
            num++;
            if(num<=minnnum)
            {
                if(num<minnnum)
                   {
                        minnnum=num;
                        minnum=m;
                   }
                   else
                   {
                       minnum=(minnum<m)?minnum:m;
                   }

            }
        }
        printf("Case %d: %d\n",k++,minnum);
    }

    return 0;
}




<pre name="code" class="cpp"><pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

int main(void)
{
    int n;
    scanf("%d",&n);
    int k=1;
    while(n--)
    {
        int m;
         int minxx;
         int sum;
        scanf("%d",&m);
         int minx=1000000000;
       for(int i=1;i<=m;i++)
       {
           int number;
           sum=0;
           scanf("%d",&number);
        int num=number;



        while(num)
        {
            if(num%2==1)
                sum++;
            num/=2;
        }
       // printf("%d %d\n",sum,minx);
      //  sum++;
        if(sum<minx)
        {
             minx=sum;
             minxx=number;
        }
        else if(sum==minx)
        {
            if(minxx>number)
                minxx=number;
        }

       }
        printf("Case %d: %d\n",k++,minxx);
    }

    return 0;
}


 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值