数组中集合位数为 K 的倍数的元素个数
集合位是 0 和 1 的二进制表示形式。这个数字 1 在计算机中被称为集合位。让我们来看一个例子来理解集合位的计算:
让我们来看一个例子来理解集合位的计算:
整数 96 的集合位计算为:
假设我们想要将位设置为 96 的和。如上所示,我们将为总和为 96 的那些数组元素设置位 1。这样我们将形成 2 组位。因此,如果我们将 K 值设为 2,则 96 的集合位是它的倍数。
在这个程序中,我们将解决集合位是 K 的倍数的数组元素计数问题。
算法
我们将从名为‘bits/stdc++.h’的头文件开始程序,该文件包含 C++ 的所有标准模板库。
我们正在创建一个名为‘find_bitcount’的函数定义,它接受三个参数,即 arr、n 和 k,并定义如下:
arr[] − 从数组的主函数获取数组输入。
n − 数组的长度
k − 检查集合位计数的可整除性。
这将计算数组元素的总集合位计数。
然后我们将‘0’存储到‘ans’变量中,该变量将跟踪满足条件的数字的计数。
我们开始 for 循环以迭代每个元素并将数组元素,即‘arr[i]’,存储到‘x’变量中,该变量稍后将在 while 循环中满足条件以检查总集合位计数的条件。这样,函数将‘x’初始化为数组元素值。
然后将变量‘setBitsCount’初始化为‘0’,它将跟踪当前数组元素的集合位计数。
接下来,我们创建一个 while 循环来检查 x(存储在 x 中的数组元素)是否大于 0,并执行以下操作:
setBitsCount += x & 1 − 位运算符 & 与 1 一起用于在循环中确定 x 的最低有效位是否为 1。
x = x >> 1 − 如果结果为 1,则集合位计数增加 1。然后在循环中使用 >> 运算符(消除最低有效位)将 x 向右移动 1 位。
现在使用 if 语句,我们使用 ‘%’ 运算符检查‘setBitsCount’是否可被‘k’整除,如果其结果等于 ‘0’,则当前数组元素满足条件,并将变量‘ans’增加‘1’。
处理上述所有条件后,函数将返回‘ans’的值,该值将定义数组元素的总集合位计数。
继续开始主函数并声明所有数组元素。然后我们将‘n’初始化为查找数组的大小,并将变量‘K’初始化为‘2’,它将检查数组元素是否是 K 的倍数。
最后,在打印语句中,我们调用名为‘find_bitcount()’的函数定义并获取结果。
示例
在这个程序中,我们将实现集合位是 K 的倍数的数组元素的计数。
#include <bits/stdc++.h> #include <bits/stdc++.h> using namespace std; // Function to find the count of numbers int find_bitcount(int arr[], int n, int k) { int ans = 0; for (int i = 0; i < n; i++) { int x = arr[i]; int setBitsCount = 0; // Calculate the set-bits count of the element x while (x > 0) { setBitsCount += x & 1; x = x >> 1; } // Check if the setbits count // is divisible by K if (setBitsCount % k == 0) ans++; } return ans; } int main() { int arr[] = { 6, 845, 4, 168, 7896 }; int n = sizeof(arr) / sizeof(arr[0]); int K = 2; cout << "There are "<<find_bitcount(arr, n, K)<<" array element whose setbits are in a multiple of K"; return 0; }
输出
There are 3 array element whose setbits are in a multiple of K
结论
我们探讨了集合位是 K 的倍数的数组元素计数的概念。在这个程序中,通过定义函数,它计算集合位数组元素的总数。然后我们观察集合位计数如何通过 >> 运算符进行移位,并使用条件语句检查有多少数组元素通过了集合位计数。最后,我们简单地打印结果。