pub fn multi_gcd(nums: &[u64]) -> u64 {
if nums.len() == 0 {
return 0;
}
let first = nums.get(0).unwrap().clone();
nums.iter().fold(first, |prev, this| gcd(prev, *this))
}
pub fn gcd(n1: u64, n2: u64) -> u64 {
let (mut a, mut b) = if n1 > n2 { (n1, n2) } else { (n2, n1) };
while b != 0 {
let r = a % b;
a = b;
b = r;
}
a
}
#[cfg(test)]
mod tests {
use super::gcd;
use super::multi_gcd;
#[test]
fn gcd_test() {
assert_eq!(0, gcd(0, 0));
assert_eq!(44, gcd(748, 2024));
assert_eq!(10, gcd(0, 10));
assert_eq!(2, gcd(4, 2));
assert_eq!(12, gcd(36, 48));
}
#[test]
fn multi_gcd_test() {
let nums = vec![12, 24, 36];
assert_eq!(12, multi_gcd(&nums));
}
}