题目:
Description
若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B类数。
例如:
13=1101
其中1的个数为3,0的个数为1,则称此数为A类数;
10=1010
其中1的个数为2,0的个数也为2,称此数为B类数;
24=11000
其中1的个数为2,0的个数为3,则称此数为B类数;
程序要求:
求出1~n之中(包括1与n),全部A、B两类数的个数。(其中n<=1000)
Input
输入一行一个数n
Output
在一行中输出两个整数A和B,A表示A类数的个数,B表示B类数的个数,AB之间由一个空格分隔,除此之外不要再输出其他多余的东西。
Sample Input 1
1000
Sample Output 1
538 462
Hint
提示:可以借助函数,将逻辑简化
Source
NOIP1995
思路
这道题不是很难,就写一个自定义函数就可以几乎把所有事情都解决了,但你也可以不写自定义函数,直接在main函数里实现,但我个人认为写自定义函数思路会清晰一点。
所以,我就用自定义函数的做法来为大家讲解这道题。qwq
自定义函数要做哪些事情呢?那当然有让10进制转成2进制,还有判断这个数里面是0多还是1多。
所以函数就可以开始写了:
bool qwq(int x){
int a=0,b=0;
while(x>0){
if(x%2){
a++;
}
else{
b++;
}
x/=2;
}
return a>b;
}
bool类型方便判断,等会再main函数里直接if判断就行了
代码:
#include<bits/stdc++.h>
using namespace std;
queue <int>q;
bool qwq(int x){
int a=0,b=0;
while(x>0){
if(x%2){
a++;
}
else{
b++;
}
x/=2;
}
return a>b;
}//自定义函数
int main(){
int n;
cin>>n;
int a=0,b=0;
for(int i=1;i<=n;i++){
if(qwq(i)){
a++;
}
else{
b++;
}//判断
}
cout<<a<<" "<<b;
return 0;
}
标准结局:

本文介绍了YCOJ比赛中的一道二进制数问题,解析了题目的思路。通过自定义函数实现10进制到2进制的转换,并判断二进制数中0和1的数量,以此解决题目要求。

4053

被折叠的 条评论
为什么被折叠?



