问题描述
给定一个长度为
n
n
n的数列,请你求出数列中每个数的二进制表示中
1
1
1的个数。
输入格式:
第一行包含整数
n
n
n。 第二行包含
n
n
n个整数,表示整个数列。
输出格式:
共一行,包含n个整数,其中的第
i
i
i个数表示数列中的第
i
i
i个数的二进制表示中1的个数。
数据范围
1
≤
n
≤
100000
1≤n≤100000
1≤n≤100000
0
≤
0≤
0≤数列中元素的值
≤
1
0
9
≤10^9
≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
思路
1、使用lowit运算,每次都找出最后一位1进行减去即可。 2、每次与1做&运算,如果本位是1,res++,每次迭代右移一位。 3、使用__builtin_popcount()函数
原题链接
C++代码:
写法一:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while ( n -- )
{
int x;
cin >> x;
int res= 0;
while(x) res += x & 1, x >>= 1;
cout << res << ' ';
}
return 0;
}
写法二:
#include <iostream>
using namespace std;
int lowit(int x)
{
return x & -x;
}
int main()
{
int n;
cin >> n;
while (n -- )
{
int x;
cin >> x;
int res = 0;
while (x) x -= lowit(x), res ++;
cout << res << ' ';
}
return 0;
}
写法三:
#include <iostream>
using namespace std;
int main()
{
int a;
cin >>a;
while ( a-- )
{
int x;
cin >> x;
cout << __builtin_popcount(x) << ' ';
}
return 0;
}
|