C++求最大公因數
在C++中,你可以使用多種方法來求兩個數的最大公因數(Greatest Common Divisor, GCD)。以下是幾種常見的方法:
-
輾轉相除法(Euclidean algorithm): 這是求兩個數最大公因數的經典算法。它通過不斷用較大的數除以較小的數,直到商為1為止,這時所得的餘數即為兩個數的最大公因數。
int gcd(int a, int b) { while (b != 0) { int t = a % b; a = b; b = t; } return a; }
-
歐幾里得算法(Extended Euclidean algorithm): 這個算法不僅可以找到兩個數的最大公因數,還可以找到它們的乘積,這對於解線性同餘方程很有用。
int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); }
-
使用std::gcd(C++17及更高版本): C++17標準庫提供了
std::gcd
函式,可以直接使用。#include <algorithm> // for std::gcd int gcd(int a, int b) { return std::gcd(a, b); }
-
使用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; }
-
使用質因數分解: 這種方法是將兩個數分解成質因數的乘積,然後找出共同的質因數,將它們相乘得到最大公因數。
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
函式是一個很好的選擇,因為它提供了標準化的接口和良好的性能。