T143497 统计
题目描述:
思路:
①:求一个数的n进制,就用这个数对n求余入栈即可,当这个数为0后,再将栈顶依次输出,得到的就是这个数的n进制。题目要求一个数的二进制,那么就用这个数对2进行求余。
②:需要注意的是题目给出的数可能为负数,此时负数的二进制就等于这个数的绝对值,取反再加1。
③:题目要求64位数,我们可以开一个数组,从第64号下标一一往前存储求余得到的数。
AC代码
#include<cstdio>
#include<queue>
using namespace std;
queue<int>q;
int a[70];
int main()
{
long long n,flag=0,ans=0;
scanf("%lld",&n);
if(n<0){
n=-n;
flag=1;
}
while(n){
q.push(n%2);
n/=2;
}
int k=64;
while(!q.empty()){
a[k--]=q.front();
// printf("%d ",q.front());
q.pop();
}
if(flag==0){ //如果这个数是正数
for(int i=64;i>=1;i--){
if(a[i]==1) ans++;
}
}
else{ //如果这个数是负数
for(k=64;k>=1;k--){ //取反
if(a[k]==1) a[k]=0;
else if(a[k]==0) a[k]=1;
}
for(k=64;a[k]==1;k--){ //再加1
a[k]=0;
}
a[k]=1;
for(int i=64;i>=1;i--){
if(a[i]==1) ans++;
}
}
printf("%lld",ans);
return 0;
}