链接
1325
题面
题目描述
如果一个整数的二进制(无前导0)中1的个数比0的个数多,我们称其为好数。如果其中1比0多k个,我们称其为k-好数
现在给你一个整数,请计算它的k。
输入
第一行一个整数T(1≤T≤10000),表示样例的个数。 以后的每行一个整数x(0≤x≤109)。
输出
每行输出一个样例的结果。如果它不是好数,输出0;否则输出k。
样例输入
4 1 2 3 4
样例输出
1 0 2 0
代码
#include<iostream>using namespace std;int length(int a)
{int res=0;//二进制位数while(a){a/=2;res++;}return res;
}int main()
{int t;scanf("%d",&t);while(t--){int num;scanf("%d",&num);int l=length(num);//二进制长度int cnt1=0,cnt2=0;for(int i=0;i<l;i++){if(num>>i&1) cnt1++;else cnt2++;}if(cnt1>cnt2) printf("%d\n",cnt1-cnt2);else printf("0\n");}return 0;
}
总结
1.位运算,按位与运算
我们这里用到的就是把数字右移多少位,求出一个数字,然后把这个数字与1按位与运算,只有两个数字同时为1,结果才是1,否则结果都是0
num>>i&1
2.我们利用一个函数求出一个十进制数字的二进制位数是多少
int length(int a)
{int res=0;//二进制位数while(a){a/=2;res++;}return res;
}
如果求十进制位数的话,把2换成10即可
3.逐步实现题目的要求即可,注意二进制数字每一位只有0和1两种可能性