T143497 统计

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值