题目:
若将一个正整数化为二进制数,在此二进制数中,我们将数字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. 如何将十进制转换为二进制,为了保持二进制格式,采用递归实现。
2. 第一步中是具有二进制形式表示的十进制数,故在对1和0计数时,使用10来取余和除等。
代码:
#include<stdio.h>
int dectobin(int n){
int end=0;
int temp=n;
if(n==0||n==1) return n;
else{
end=dectobin(n/2)*10+n%2;
}
return end;
}
int count_1(int n){
int count = 0;
int temp=n;
while(n!=1&&n!=0){
if(n%10==1) count++;
n/=10;
}
if(n==1) count++;
return count;
}
int count_0(int n){
int count = 0;
int temp=n;
while(n!=1&&n!=0){
if(n%10==0) count++;
n/=10;
}
if(n==0) count++;
return count;
}
int main(){
int a_count=0,b_count=0;
for(int i=1;i<=1000;i++){
int a=0,b=0;
int temp=dectobin(i);
a=count_1(temp);
b=count_0(temp);
if(a>b) a_count++;
else b_count++;
}
printf("%d %d\n",a_count,b_count);
return 0;
}
测试:
输出为:538 462