任务描述
若将一个正整数化为二进制数,在此二进制数中,我们将数字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类数; 程序要求:求出k1~k2之中(包括在1与1000区间内),全部A、B两类数的个数。
输入格式:
一行中两个整数,空格分隔,表示k1和k2,保证k1<k2。
输出格式:
一行,包含两个整数,分别是A类数和B类数的个数,中间用单个空格隔开。
输入样例:
1 1000
输出样例:
538 462
代码如下:
#include<stdio.h>
void f(int n,int m);
int g(int i);
int main ()
{ int n,m;
scanf("%d %d",&n,&m);//输入取值范围
f(n,m);
return 0;
}
void f(int n,int m)//从范围内找出AB类个数
{ int i,c=0,d=0;
for(i=n;i<=m;i++)//依次取值
{ g(i);//判断AB型
if(g(i)==1) { c++ ; }//为方便统计A个数
else { d++; }//统计B个数
}
printf("%d %d",c,d);//输出AB个数
}
int g(int n)//判断i是a or b类型 a反1 b反0
{ int d=0,c=0;
while(n)//截至二进制0
{ if (n%2==0) { d++; }
else { c++; }
n=n/2;
} if(c>d) { return 1; }//1比0多,为A,反1
else { return 0; }//反之,为B,反0
}