BD. maoge数数
Problem ID: 7624
Contest ID: 5697
必做题
题目描述
maoge 早在七岁的时候就学会了在二进制下如何数数,现在maoge想让你求出区间 [l,r] 之间的所有数在二进制下1的个数和0的个数之和
输入格式
输入两个数l, r
输出格式
输出两个数用空格隔开,表示1的个数之和和 0的个数之和。
样例输入
12 18
样例输出
17 14
数据范围
1 <= l <= r <= 100000
不会做啊,求题解!!!
Problem ID: 7624
Contest ID: 5697
必做题
题目描述
maoge 早在七岁的时候就学会了在二进制下如何数数,现在maoge想让你求出区间 [l,r] 之间的所有数在二进制下1的个数和0的个数之和
输入格式
输入两个数l, r
输出格式
输出两个数用空格隔开,表示1的个数之和和 0的个数之和。
样例输入
12 18
样例输出
17 14
数据范围
1 <= l <= r <= 100000
不会做啊,求题解!!!
思路:由于是要统计1和0的个数
那么就要先将十进制转化为二进制·
再遍历统计好的数组分别找区间[l,r]中1和0的个数即可
说得《真.简单》
在写代码了
thank you
牛!!
详细思路在代码里:
(至少样例过了)一开始想把二进制数存在数组里
但是发现不太对
所以
以下是核心代码:
定义:
int count0,count1;//统计0和1的个数之和
十转二函数并处理:
void change(int x){//十转二函数 并处理
int t;//用作记录
while(x>0){
t=x%2;//除以二取余
if(t==1) count1++;//统计1的个数
else count0++;//统计0的个数
x/=2;//更新x值
}
}
在[l,r]区间内遍历:
count1=count0=0;//初始化为0
for(int k=l;k<=r;k++){
change(k);//处理
}
输入输出自己写
有用的话给个解决方案呗
易理解的代码
谢谢,解决方案已给
十进制转二进制方法:
一个整数n,s1,s0;s1:一的个数,s0:0的个数
如果n%2是1,
s1++;
否则(n%2是0){
s0++;
}
有点慢,但对于这道来说够了
但如果追求简洁的话可以使用itoa(doge
用法:itoa(数,所得结果保存的字符串,进制)