小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。
做题过程:
自己试试用数电课上教过的求补码方式,先将负数转化为正数,然后将加一,结果WA了很多发,后面看别人的题解发现别人都加了unsigned(无符号定义),说是可以将负数转化为补码形式,然后过了。
代码实现:
#include<bits/stdc++.h>
using namespace std;
void solve()
{
unsigned long long n;
while(cin>>n)
{
int sums=0;
while(n)
{
if(n&1)sums++;
n>>=1;
}
cout<<sums<<'\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
while(t--)
solve();
return 0;
}