【算法】【位运算】acwing算法基础 801. 二进制中1的个数
题目
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式 共一行,包含 n 个整数,其中的第 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
来源:acwing算法基础 801. 二进制中1的个数
纯代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 1;
int a[N];
int i_t (int a)
{
int sum = 0;
while (a != 0)
{
sum += a % 2;
a /= 2;
}
return sum;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++)
{
scanf ("%d", &a[i]);
cout << i_t (a[i]) << " ";
}
return 0;
}
题解(带注释)
#include<bits/stdc++.h> // 包含常用的头文件,如iostream、vector、algorithm等
using namespace std;
const int N = 1e5 + 1; // 定义常量N,表示数组的最大大小
int a[N]; // 定义一个大小为N的数组a,用于存储输入的数据
// 函数i_t:计算整数a的二进制表示中1的个数
int i_t(int a)
{
int sum = 0; // 初始化计数器sum,用于记录1的个数
while (a != 0) // 当a不为0时,继续循环
{
sum += a % 2; // 取a的最低位(0或1),并加到sum中
a /= 2; // 将a右移一位,相当于去掉最低位
}
return sum; // 返回1的个数
}
int main()
{
int n; // 定义变量n,表示输入数据的个数
cin >> n; // 输入n的值
// 循环读取n个整数,并计算每个整数的二进制表示中1的个数
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]); // 读取第i个整数并存储到数组a中
cout << i_t(a[i]) << " "; // 调用i_t函数计算1的个数,并输出结果
}
return 0; // 程序正常结束
}