A类数与B类数(来源HZNUOJ)
Description
若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B类数。
解题思路:设置变量count=0,将输入的数&1,若结果是1,就count++,然后再使用>>符降位,最终count的数量就是1的数量
int func(int num)
{
int count=0;
while(num)
{
if((num&1)==1)
count++;
num>>=1;
}
}
接下来就是如何统计0的数量
其实统计0的数量和统计1的数量如出一辙------->将num&1==0--->num&1!=0
int func(int num)
{
int count=0;
while(num)
{
if((num&1)!=1)
count++;
num>>=1;
}
}
最后是这道题的AC代码:
#include <iostream>
using namespace std;
int func(int num)
{
int count = 0;
while (num)
{
if ((num & 1) == 1)
{
count++;
}
num >>= 1;
}
return count;
}
int fun(int num)
{
int count = 0;
while (num)
{
if ((num & 1) != 1)
{
count++;
}
num >>= 1;
}
return count;
}
int main()
{
int i, j, m, t, n;
int couta = 0;
int coutb = 0;
for (i = 1; i <= 1000; i++)
{
n = func(i);
m = fun(i);
if (n > m)
couta++;
else
coutb++;
}
printf("%d %d", couta, coutb);
return 0;
}
求1的数量也有其他更好方法,但可能相比较下会更抽象一点
另解:使用&符
思路:由于每执行一次x&(x-1)会使x的最右边一位1变成0,多次使用直至x=0
int func(int num)
{
int count=0;
while(num)
{
count++;//一开始进入循环就说明count至少有一个1
num=num&(num-1);
}
}
关于求二进制1的个数和0的个数,我的见解就只有这么多了,但相信网上存在更多更快更妙的方法,就留给大家自己探索