这咋做,《好神奇》

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
不会做啊,求题解!!!

1 个赞

思路:由于是要统计1和0的个数
那么就要先将十进制转化为二进制·
遍历统计好的数组分别找区间[l,r]中1和0的个数即可

1 个赞

说得《真.简单》

1 个赞

在写代码了

1 个赞

thank you

1 个赞

牛!!

1 个赞

详细思路在代码里:
(至少样例过了)
一开始想把二进制数存在数组里
但是发现不太对
所以

一边转化为二进制

一边处理

以下是核心代码:
定义:

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);//处理
	}

输入输出自己写

有用的话给个解决方案呗

3 个赞

易理解的代码

谢谢,解决方案已给

1 个赞

十进制转二进制方法:
一个整数n,s1,s0;s1:一的个数,s0:0的个数
如果n%2是1,
s1++;
否则(n%2是0){
s0++;
}

有点慢,但对于这道来说够了
但如果追求简洁的话可以使用itoa(doge
用法:itoa(数,所得结果保存的字符串,进制)