水题~~
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
输入一组正整数,每个正整数取值为【1,255】,你们懂得,刚好用8位二进制位可以表示。。。
你要做的就是:对于每个输入的正整数,如果她的二进制位有偶数个1,则该数满足要求,把符合要求的正整数的二进制位相加,并用二进制表示法输出。你知道规律吗?
-
输入
-
有多组测试数据。
每组测试数据第一行输入N,表示有N个正整数,N<=255
第二行输入N个正整数,每个正整数取值为[1~255]
输出
- 输出所有满足要求的正整数的二进制表示法的和 样例输入
-
5 1 2 3 4 5 7 1 2 3 4 5 6 7 2 1 2
样例输出
-
1000 1110 0
提示
- 样例1:3的二进制为00000011,5的二进制为00000101,符合条件,故相加即得1110(忽略前面的零)。
-
有多组测试数据。
如题所言,水题...判断每个数的二进制位是奇数还是偶数,直接循环统计就可以,对二进制的转化比较熟悉很轻松就能解决,统计出结果之后,转化为二进制的形式输出就可以了...
#include<stdio.h>
int n,x[305],sum;
int judge(int t)//判断是否符合偶数个 1
{
int cnt=0;
while(t)
{
if(t&1)
{
++cnt;
}
t/=2;
}
if(cnt&1)
{
return 0;
}
return 1;
}
void slove()
{
int cnt=0;
while(sum)
{
x[cnt++]=(sum%2);//转化为二进制
sum/=2;
}
for(int i=cnt-1;i>0;--i)//输出二进制表示
{
printf("%d",x[i]);
}
printf("%d\n",x[0]);
}
int main()
{
while(~scanf("%d",&n))
{
sum=0;
for(int i=0;i<n;++i)
{
int a;
scanf("%d",&a);
if(judge(a))//判断
{
sum+=a;//累加和
}
}
slove();
}
return 0;
}