題目不是很難的題目;但是想到前幾天看的一個快速計算 一個十進制數 轉換爲 二進制 包含 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;
}