题目不是很难的题目;但是想到前几天看的一个快速计算 一个十进制数 转换为 二进制 包含 1 的个数
但是到今天又忘了;
计算某个数二进制中1的个数
int CountBits(int v)
{
int num = 0;
while(v)
{
v &= (v-1);
num++;
}
return num;
}
本题统计下 1个数为i的数字,储存个数在 num[i]里面
然后 计算 n*(n+1)/ 2;
题目代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <iomanip>
using namespace std;
#define maxn 100005
__int64 num[64];
int CountBits(int v)
{
int num = 0;
while(v)
{
v &= (v-1);
num++;
}
return num;
}
int main(int argc, char *argv[])
{
int n,a;
scanf("%d",&n);
int Count;
memset(num,0,sizeof(num));
for(int i = 0; i < n; i++)
{
scanf("%d",&a);
num[CountBits(a)]++;
}
__int64 ans = 0;
for(int i = 0; i < 64; i++)
{
ans += (num[i])*(num[i]-1)/2;
}
printf("%I64d\n",ans);
return 0;
}