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;
}