题目描述:
统计非负整数二进制展开中数位1的总数。如整数64 的二进制展开为00000000 00000000 00000000 00100000 ,数位1的总数为1。
输入格式:
输入一个整数n , 题目保证n 不大于 10的18次方。
输出格式:
输出该整数二进制展开中数位1的总数。
输入样例:
在这里给出一组输入。例如:
441
输出样例:
在这里给出相应的输出。例如:
6
思路描述:
十进制整数展开成二进制数,有0和1两个值,0代表没有值,我们只需要计算1的数量,二进制中所有位数的1转化为对应的十进制数相加,就是十进制的原数,我们可以从最高位开始判断,我们可以用一个整型变量x=1,令之不断*2,当x>n时,说明超过最高位了,因此,x/2此时的值就是二进制最高位所代表的的十进制数,然后用n-x/2得到剩下的值,然后一直循环,直至n<0。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n,x=1;
int count=0;
cin >> n;
while(n){
x*=2;
if(x>n){
n=n-x/2;
count++;
x=1;
}
}
cout << count << endl;
return 0;
}