题解 | #牛牛的10类人#
牛牛的10类人
https://www.nowcoder.com/practice/232b7fc32fac4636819e31a7d7c960a3
描述
世界上有10类人,1类是懂二进制的,另一类的不懂二进制的。牛牛是第10种人,因此他是懂二进制的。
牛牛把二进制数分成两种,一种是 1 的数量是偶数的,牛牛称之为 1 数,一种是 0 的数量是偶数的,牛牛称之为 0 数,如果一个数同时是 1 数和 0 数,那称之为 10 数。
输入描述:
第一行输入一个正整数 n 表示数的个数
第二行输入 n 个正整数,表示每个输入的数字
输出描述:
输出一行,对每个数字进行分类,即输出 0 或 1 或 10,如果既不是 0 类也不是 1 类则输出 100
示例1
输入:
2 1 10
0 10
解题思路:
按照题目要求写输入函数,然后逐一判断。
这里提供一个 通过按位与来判断整数二进制位的方法。
#include <stdio.h>
int func(int x)
{
int temp=x;
int count=temp&1;//统计1的个数 初始化为整数二进制末位(整数二进制如果末位是1 count初始化为1,反之为0)
int tnuoc=count^1;//统计0的个数 count如果是1tnuoc就为0 反之为1
while(temp >>= 1)
{
if(temp&1==1)
{
count++;
}
else
{
tnuoc++;
}
}
if(count%2==0&&tnuoc%2==0)
{
return 10;
}
else if(count%2==0&&tnuoc%2!=0)
{
return 1;
}
else if(count%2!=0&&tnuoc%2==0)
{
return 0;
}
else
{
return 100;
}
}
int main()
{
int n;
scanf("%d",&n);
int arr[n];
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(int i=0;i<n;i++)
{
int flag=func(arr[i]);
switch(flag)
{
case 0:
{
printf("0 ");
break;
}
case 1:
{
printf("1 ");
break;
}
case 10:
{
printf("10 ");
break;
}
default:
{
printf("100 ");
break;
}
}
}
return 0;
}
int func(int x)
{
int temp=x;
int count=temp&1;//统计1的个数 初始化为整数二进制末位(整数二进制如果末位是1 count初始化为1,反之为0)
int tnuoc=count^1;//统计0的个数 count如果是1tnuoc就为0 反之为1
while(temp >>= 1)
{
if(temp&1==1)
{
count++;
}
else
{
tnuoc++;
}
}
if(count%2==0&&tnuoc%2==0)
{
return 10;
}
else if(count%2==0&&tnuoc%2!=0)
{
return 1;
}
else if(count%2!=0&&tnuoc%2==0)
{
return 0;
}
else
{
return 100;
}
}
int main()
{
int n;
scanf("%d",&n);
int arr[n];
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(int i=0;i<n;i++)
{
int flag=func(arr[i]);
switch(flag)
{
case 0:
{
printf("0 ");
break;
}
case 1:
{
printf("1 ");
break;
}
case 10:
{
printf("10 ");
break;
}
default:
{
printf("100 ");
break;
}
}
}
return 0;
}