110004 - 二进制分类

题解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;    
}//珍爱生命,拒绝抄袭