【题目描述】
若将一个正整数化为二进制数,在此二进制数中,我们将数字1
的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B
类数。
例如:
(13)10=(1101)2
,其中1的个数为3,0的个数为1,则称此数为A
类数;
(10)10=(1010)2
,其中1的个数为2,0的个数也为2,称此数为B
类数;
(24)10=(11000)2
,其中1的个数为2,0的个数为3,则称此数为B
类数;
程序要求:求出1∼1000
之中(包括1与1000),全部A、B
两类数的个数。
【输入】
(无)
【输出】
一行,包含两个整数,分别是A
类数和B
类数的个数,中间用单个空格隔开。
【输入样例】
(无)
【输出样例】
(无)
#include <iostream>
using namespace std;
bool isClassA(int n)//判断数字n是否是A类数
{
int s1 = 0, s0 = 0;//s1:1的个数 s0:0的个数
for(int a = n; a > 0; a /= 2)//二进制下数字拆分 除基取余
{
if(a % 2 == 1)//如果这一位是1
s1++;
else//如果这一位是0
s0++;
}
return s1 > s0;//如果1比0多,那么是A类数
}
int main()
{
int ctA = 0, ctB = 0;//ctA:A类数个数 ctB:B类数个数
for(int i = 1; i <= 1000; ++i)
{
if(isClassA(i))//如果i是A类数
ctA++;
else//如果i是B类数
ctB++;
}
cout << ctA << ' ' << ctB;
return 0;
}