Problem
Given two positive integer numbers a
and b
, we need to find their common factors. A common factor of a
and b
is an integer number that divides both a
and b
without a remainder.
Examples:
Input a | Input b | Output |
18 | 6 | [1, 2, 3, 6] |
5 | 10 | [1, 5] |
3 | 5 | [1] |
252 | 105 | [1, 3, 7, 21] |
Solution
fn find_common_factors(a: u32, b: u32) -> Vec<u32> {
assert!(a > 0 && b > 0, "a & b must be positive");
fn gcd(mut a: u32, mut b: u32) -> u32 {
while a != b {
if a > b {
a = a - b;
} else {
b = b - a;
}
}
a
}
(1..=gcd(a, b))
.filter(|n| a % n == 0 && b % n == 0)
.collect()
}
Explanation
We iterate over [1..gcd(a, b)]
numbers and filter
in only numbers n
that divide both a
and b
without a remainder (a % n == 0 && b % n == 0
). It is enough to iterate up to the Greatest common divisor returned by the gcd(a, b)
function call.
And to calculate the gcd
we use the simple Euclidean algorithm.
Complexity
The time complexity of the solution is O(gcd(a, b))
. The auxiliary space complexity is O(1)
.