Description
若将一个正整数化为二进制数,在此二进制数中,我们将数字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和1000是十进制数!,所以A+B=1000(十进制)
Input
无输入
Output
在一行中输出两个整数A和B,A表示A类数的个数,B表示B类数的个数,AB之间由一个空格分隔,除此之外不要再输出其他多余的东西。
Sample Input 1
无
Sample Output 1
见上述提示
思路:
暴力枚举,
(1)用一个for循环从1到1000枚举,在for循环中将每个数取出二进制的每位,1000的二进制就9位数,时间复杂度也就差不多9000多,不会超时
(2)对于每个数的二进制位有0则num0++(num0是下面代码中定义的),有1则num1++;
注意每次循环都要将num0 和num1重新置为0 ,统计每个数的0和1;
(3)统计flaga和flagb
代码如下:
1 #include<iostream> 2 using namespace std; 3 4 int tmp; 5 int b , c; 6 int num0 ,num1; 7 int flaga = 0, flagb = 0; 8 int main() 9 { 10 for(int i = 1; i <= 1000;i++) 11 { 12 num0 = 0,num1 = 0; 13 b = i; 14 while(b!=0) 15 { 16 c = b%2; 17 b/=2; 18 if(c==0) num0++; 19 if(c==1) num1++; 20 } 21 if(num0>=num1) flagb ++; 22 else flaga++; 23 } 24 cout<<flaga<<" "<<flagb; 25 return 0 ; 26 }