簡體   English   中英

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 函數__gcd

k&ik = k<<1部分是找出哪些數字屬於由位掩碼表示的集合。 如果你不完全理解它,試着看看如果i = 0b11010會發生什么,通過在一張紙上或在調試器中運行這個循環。 您會注意到k&i條件在第二次、第四次和第五次迭代時為真,恰好是i在其二進制表示中的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM