题目:
小A刚学了二进制,他十分激动。为了确定他的确掌握了二进制,你给他出了这样一道题目:给定N个非负整数,将这N个数字按照二进制下1的个数分类,二进制下1的个数相同的数字属于同一类。求最后一共有几类数字?
输入描述:
输入的第一行是一个正整数T(0<T<=10),表示样例个数。
对于每一个样例,第一行是一个正整数N(0<N<=100),表示有多少个数字。
接下来一行是N个由空格分隔的非负整数,大小不超过2^31 – 1。
输出描述:
对于每一组样例,输出一个正整数,表示输入的数字一共有几类。
示例:
输入
1
5
8 3 5 7 2
输出
3
解析
输入范围为[0,2^31 – 1],则分类可能为0个1至31个1,在计算出输入的元素的二进制的1的数量后,对数组进行遍历查看哪几个非0就可。
代码:
#include <iostream>
using namespace std;
//对输入数据进行二进制化,返回1的个数
int binaryCount(int n)
{
int count = 0;
while (n>0)
{
if(n%2==1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int t, n;
cin >> t;
while (t--)
{
cin >> n;
//存储0个1到31个1的可能
int arr[32] = {};
for(int i=0;i<n;i++)
{
int x;
cin >> x;
//数组对应位置记录
arr[binaryCount(x)]++;
}
//遍历
int sum = 0;
for(int i=0;i<32;i++)
{
if(arr[i]!=0)
{
sum++;
}
}
cout << sum << endl;
}
return 0;
}