一道c语言编程题,高分求助,在线等!

若将一个正整数化为二进制数,在此二进制数中,我们将数字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两类数的个数。

输入一个数,求出1到这个数之间的AB类数

输出一行输出两个数,空格隔开。
有简单点的吗,是c语言的啊

第1个回答  2011-12-17
对不起,bool在C语言是没有的,改成int就对了。其他的应该都没什么问题了,以下代码有注释,不懂可以问我

#include <stdio.h>

int isA(int n) //函数判断是否A类数,是返回1,否则返回0
{
int m = n;
int one = 0; //1的个数
int zero = 0; //0的个数
while (m)
{
if (m % 2) //如果不能被2整除,最低位就是1
{
one++;
}
else //否则就是0
{
zero++;
}
m /= 2;
}
if (one > zero)
{
return 1;
}
return 0;
}
void main()
{
int i, n;
int a = 0; //A类数的个数
int b = 0; //B类数的个数
int acount[1000]; //保存A类数
int bcount[1000]; //保存B类数
for (i = 1; i <= 1000; i++) //1到1000求A、B类数的个数
{
if (isA(i))
{
a++;
}
else
{
b++;
}
}
printf("A类数:%d B类数:%d\n", a, b);
a = 0;
b = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++) //求1到n,A、B类数
{
if (isA(i))
{
acount[a] = i;
a++;
}
else
{
bcount[b] = i;
b++;
}
}
printf("A类数:\n");
for (i = 1; i < a; i++) //打印A类数
{
printf("%d ", acount[i]);
if (i % 2 == 0)
{
printf("\n");
}
}
printf("\nB类数:\n");
for (i = 1; i < b; i++) //打印B类数
{
printf("%d ", bcount[i]);
if (i % 2 == 0)
{
printf("\n");
}
}
}本回答被提问者采纳
第2个回答  2011-12-16
#include<stdio.h>
#include<stdlib.h>

void NumberOf1and0_Solution(int i,int* count0,int* count1)
{
*count0 = 0;
*count1 = 0;

while(i)
{
if(i & 1)
*count1+=1;
else *count0+=1;

i = i >> 1;
}
}

void main()
{
int N,countA=0,countB=0;
int nZero,nOne,i;

for(i=1;i<=1000;i++)
{
NumberOf1and0_Solution(i,&nZero,&nOne);

if(nOne>nZero) countA++;
else countB++;
}

printf( "1~1000之间,A类数有%d个,B类数有%d个\n",countA,countB);
system( "pause ");
}
第3个回答  2011-12-18
.
相似回答