C++找最大公因數

在C++中,你可以使用多種方法來找出兩個或多個整數的最大公因數(Greatest Common Divisor, GCD)。以下是幾種常見的方法:

  1. 輾轉相除法(Euclidean algorithm): 這是計算兩個整數GCD的標準算法。它通過不斷將除數和餘數交換位置,直到餘數變為0,此時除數即為GCD。

    int gcd(int a, int b) {
        while (b != 0) {
            int t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
  2. 歐幾里得算法(Euclidean Extended algorithm): 這個算法不僅可以找到兩個整數的GCD,還可以找到它們的線性組合,即滿足 a = x b + y gcd(a, b) 的整數 x 和 y。

    int gcd(int a, int b) {
        while (b != 0) {
            int t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
    
    std::pair<int, int> extended_gcd(int a, int b) {
        while (b != 0) {
            int t = a % b;
            a = b;
            b = t;
            int x = 1, y = 0;
            if (t != 0) {
                int old_x = x;
                x = y;
                y = old_x - y * (a / b);
            }
        }
        return std::make_pair(a, x);
    }
  3. 質因數分解法: 這種方法將每個數分解成質因數的乘積,然後找到共同的質因數,最後將這些質因數的乘積作為GCD。

    int gcd(int a, int b) {
        std::vector<int> pa, pb;
        for (int i = 2; i * i <= a; ++i) {
            if (a % i == 0) {
                while (a % i == 0) {
                    a /= i;
                }
                pa.push_back(i);
            }
        }
        if (a != 1) {
            pa.push_back(a);
        }
        for (int i = 2; i * i <= b; ++i) {
            if (b % i == 0) {
                while (b % i == 0) {
                    b /= i;
                }
                pb.push_back(i);
            }
        }
        if (b != 1) {
            pb.push_back(b);
        }
        int gcd = 1;
        for (int i : pa) {
            for (int j : pb) {
                gcd = std::max(gcd, std::min(i, j));
            }
        }
        return gcd;
    }
  4. 快速GCD算法: 這是一種最佳化後的輾轉相除法,可以在O(log(max(a, b)))時間內找到GCD。

    int gcd(int a, int b) {
        while (b != 0) {
            int t = a % b;
            a = b;
            b = t;
            if (t == 0) {
                return a;
            }
            a /= t;
            b /= t;
        }
        return a;
    }

選擇哪種方法取決於你的具體需求和效率要求。對於大多數情況,輾轉相除法是最簡單和最有效的。