题解byliguanghan1
若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B类数。例如:
13化为2进制:1101,1有3个,0有1个,故为a类数。
10化为2进制:1010,1和2均有两个,为b类数。(特殊样例:1的个数=0的个数)
24化为2进制:11000,1有2个,0有3个,为b类数。
程序要求:求出a,b之间(包括a,b)的全部A,B两类数的个数。
输入:两个整数,即A和B。(1<=A,B<=1000)
输出:一行,包含两个整数,分别是A类数和B类数的个数,中间用单个空格隔开。
1.一个十进制数转化为二进制数后比较零和一的数量,1多为a类数,否则为b类数(等于算b);
2.输出输入两数之间a和b类数的个数
1.十进制数不一定要转换(耗时间),每一次取除以2的余数后再去掉即可; 2.用位移会更快(位移的优先级比除号低),a>>=b代表a除以2的b次方。
#include <bits/stdc++.h>
using namespace std;
int main()
{
//freopen("classify.in","r",stdin);
//freopen("classify.out","w",stdout);
int j,a,b,mod,ta=0,tb=0,x,y;
//使用j来处理,不影响程序;mod提取判断;ta和tb统计,a和b则统计具体数里0和1的个数
cin>>x>>y;
for(; x<=y; x++)//逐个扫描
{
j=x,a=0,b=0;
while(j)//数的判断
{
mod=j%2;
j>>=1;//右移,代替除以二
if(mod)//如果是一
a++;//a加一
else//否则
b++;//b加一
}
if(a>b)//比较
ta++;
else
tb++;
}
cout<<ta<<' '<<tb;
return 0;
}//珍爱生命,拒绝抄袭