C++求最大公因數

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

  1. 輾轉相除法(Euclidean algorithm): 這是求兩個數最大公因數的經典算法。它通過不斷用較大的數除以較小的數,直到商為1為止,這時所得的餘數即為兩個數的最大公因數。

    int gcd(int a, int b) {
        while (b != 0) {
            int t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
  2. 歐幾里得算法(Extended Euclidean algorithm): 這個算法不僅可以找到兩個數的最大公因數,還可以找到它們的乘積,這對於解線性同餘方程很有用。

    int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }
  3. 使用std::gcd(C++17及更高版本): C++17標準庫提供了std::gcd函式,可以直接使用。

    #include <algorithm> // for std::gcd
    
    int gcd(int a, int b) {
        return std::gcd(a, b);
    }
  4. 使用std::numeric_limits: 如果你只需要最大公因數,而不需要乘積,可以使用std::numeric_limits<int>::max()來代替std::gcd

    #include <limits> // for std::numeric_limits
    
    int gcd(int a, int b) {
        return std::numeric_limits<int>::max() / b * a;
    }
  5. 使用質因數分解: 這種方法是將兩個數分解成質因數的乘積,然後找出共同的質因數,將它們相乘得到最大公因數。

    int gcd(int a, int b) {
        std::vector<int> pa, pb;
        for (int i = 2; i * i <= a && i * i <= b; ++i) {
            if (a % i == 0 && b % i == 0) {
                pa.push_back(i);
                if (i * i <= a && a % (i * i) == 0) {
                    pa.push_back(a / i);
                }
                if (i * i <= b && b % (i * i) == 0) {
                    pb.push_back(b / i);
                }
            }
        }
        int gcd = 1;
        for (int i : pa) {
            for (int j : pb) {
                gcd *= std::min(i, j);
            }
        }
        return gcd;
    }

選擇哪種方法取決於你的需求和效率要求。對於大多數情況,輾轉相除法是最簡單和高效的。如果你使用的是C++17或更新的版本,std::gcd函式是一個很好的選擇,因為它提供了標準化的接口和良好的性能。