问题描述
给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
如5的二进制为101,包含2个“1”。
输入格式
第一行包含2个数L,R
输出格式
一个数S,表示[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
样例输入
2 3
样例输出
3
咱先看代码
while(k){
k=k&(k-1);//消除k的二进制中最后一个1
sum++; //统计k的二进制中1的个数
}
这个操作可以求出该数的二进制数中1的个数,是不是很神奇
举个例子,比如11的二进制是1011
那么:
1011 &(1011-1)= 1011 & 1010 = 1010
1010 &(1010-1)= 1010 & 1001 = 1000
1000 & (1000-1) = 1000 & 0111 = 0000
总共三次,那么1的个数就是三个,你们可以自行试验其他的数值
那么AC代码如下
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
int l,r,sum=0;
cin>>l>>r;
for(int i=l;i<=r;i++){
int k=i;
while(k){
k=k&(k-1);
sum++;
}
}
cout<<sum;
}