C++ 中数组中所有数字的 LCM
lcm of all numbers in an array in c++
我遇到了这段代码来计算数组中所有数字的最小公因数,但无法理解所使用的算法。这里用来计算设定位数的__builtin_popcount
有什么用?
pair<long long, int> pre[200000];
long long a[25], N;
long long trunc_mul(long long a, long long b)
{
return a <= INF / b ? a * b : INF;
}
void compute()
{
int limit = 1 << N;
limit--;
for (int i = 1; i <= limit; i++)
{
long long lcm = 1;
pre[i].second = __builtin_popcount(i);
int k = 1;
for (int j = N - 1; j >= 0; j--)
{
if (k&i)
{
lcm = trunc_mul(lcm / __gcd(lcm, a[j]), a[j]);
}
k = k << 1;
}
pre[i].first = lcm;
}
return;
}
您提供的截取代码最多提供 25 个数字。对于每个数字子集,它将它们的 LCM 计算成pre[i].first
并将该子集中的数字计算成 pre[i].second
。子集本身表示为位掩码,因此要计算子集中的元素数,代码片段使用 __builtin_popcount
.它与LCM的计算无关。
LCM 是使用一种相当标准的方法计算的:任何一组数字的 LCM 等于它们的乘积除以它们的 GCD。这正是这个截图所做的,使用内置的GCD函数__gcd
。
k&i
和k = k<<1
部分是找出哪些数字属于由位掩码表示的集合。如果您不完全理解它,请尝试通过在一张纸上或在调试器中运行此循环来查看如果i = 0b11010
会发生什么。您会注意到,k&i
条件在第二次、第四次和第五次迭代中将为真,恰好是i
在其二进制表示中具有 1 的位置。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++ 中数组中所有数字的 LCM
- 使用模板计算2个数字的LCM
- C++程序来计算 1 到 20 之间的数字的 LCM(欧拉项目)
- c++中使用多个数字的LCM递归函数