题目
小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
解析
要求一个数二进制有多少个1,肯定不能化成二进制然后去数个数。所以就想一个二进制数可以从左向右一个一个1的拿掉 直到为0为止,比如说9 二进制表示为1001,9-8得1 二进制为0001
1在减1得0000 一共减了两次 所以有两个1。
就是这样 让一个数从231 减230一直减到1 知道减出来的数为0为止 统计减的次数就是1的个数
只有你要减的这个数大于2的多少次幂那个数才可以减。
代码
#include <iostream>
using namespace std;
int main()
{
int t,n,i;
double A[32];
A[0] = 1;
A[1] = 2;
for (i = 2; i <= 31; i++)
{
A[i] = 2 * A[i - 1];
}
cin >> t;
while (t--)
{
cin >> n;
double num;
int sum[32];
for (i = 0; i <= 31; i++)
sum[i] = 0;
for (i = 0; i < n; i++)
{
cin >> num;
int number = 0;
for (int j = 31; j >= 0; j--)
{
if (num == 0)
{
break;
}
if (num >= A[j])
{
num -= A[j];
number++;
continue;
}
}
sum[number]++;
}
int all = 0;
for (i = 0; i <= 31; i++)
{
if (sum[i] != 0)
all++;
}
cout << all << endl;
}
return 0;
}