NOIP信息奥赛--1995“同创杯”初中复赛题题解(三)

NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛复赛测试数据(初中组)

第三题

在这里插入图片描述

输出结果为: A类=538 B类=462

本题解析:本题的关键是要计算二进制数中0和1的个数。具体代码如下:

#include <QCoreApplication>
#include<iostream>
using namespace  std;


int getOne(int value);
//int getZero(int value);

int getBits(int value);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    cout<<"hell NOIP!"<<endl;

   // emun {A = 0,B};

    int cntA = 0;
    int cntB = 0;

    cout<<"the bits of value is: "<<getBits(2)<<endl;

    for(int i = 1;i<=1000;i++)
    {
        int result_1 = 0;
        int result_0 = 0;

         result_1 = getOne(i);   //计算得到二进制数中1的个数
         
         result_0 = getBits(i)-result_1;  //计算得到二进制数中0的个数

         if(result_1 > result_0)
         {
           cntA++;
         }
         else
         {
            cntB++ ;
         }
    }



    cout<<"the class A in 1 to 1000 is :"<<cntA<<endl;

     cout<<"the class B in 1 to 1000 is :"<<cntB<<endl;

    return a.exec();
}

//统计二进制数中“1”的个数,用如下代码
int getOne(int value)
{
    int cnt = 0;
    while(value)
    {
        cnt++;
        //消除所有1,变成0
        value = value & (value - 1);
    }
    return cnt;
}


//判断二进制数的位数
int getBits(int value)
{
    int fv=1;

    if(value==1)
    {
        return 1;
    }

    for (int i = 1; i < 15; i++) {

       fv = fv*2;
        if(fv>value)
        {
           return i;
        }
        else if(fv == value)
        {
            return i+1;
        }
    }
    return 0;
}


//统计二进制数中“0”的个数,用如下代码
int getZero(int value)
{
   int cnt = 0;
   while(value+1)
   {
       cnt++;
       //消除所有0,变成1
       value = value | (value + 1);
   }
   return cnt;
}

原创文章 41 获赞 0 访问量 2053

猜你喜欢

转载自blog.csdn.net/qq_21291397/article/details/104462038