C++找最大公因數
在C++中,你可以使用多種方法來找出兩個或多個整數的最大公因數(Greatest Common Divisor, GCD)。以下是幾種常見的方法:
-
輾轉相除法(Euclidean algorithm): 這是計算兩個整數GCD的標準算法。它通過不斷將除數和餘數交換位置,直到餘數變為0,此時除數即為GCD。
int gcd(int a, int b) { while (b != 0) { int t = a % b; a = b; b = t; } return a; }
-
歐幾里得算法(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); }
-
質因數分解法: 這種方法將每個數分解成質因數的乘積,然後找到共同的質因數,最後將這些質因數的乘積作為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; }
-
快速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; }
選擇哪種方法取決於你的具體需求和效率要求。對於大多數情況,輾轉相除法是最簡單和最有效的。