| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | //! Least common multiple (https://mathworld.wolfram.com/LeastCommonMultiple.html) |
| 2 | const std = @import("std"); |
| 3 | |
| 4 | /// Returns the least common multiple (LCM) of two integers (`a` and `b`). |
| 5 | /// For example, the LCM of `8` and `12` is `24`, that is, `lcm(8, 12) == 24`. |
| 6 | /// If any of the arguments is zero, then the returned value is 0. |
| 7 | pub fn lcm(a: anytype, b: anytype) @TypeOf(a, b) { |
| 8 | // Behavior from C++ and Python |
| 9 | // If an argument is zero, then the returned value is 0. |
| 10 | if (a == 0 or b == 0) return 0; |
| 11 | return @abs(b) * (@abs(a) / std.math.gcd(@abs(a), @abs(b))); |
| 12 | } |
| 13 | |
| 14 | test lcm { |
| 15 | const expectEqual = std.testing.expectEqual; |
| 16 | |
| 17 | try expectEqual(lcm(0, 0), 0); |
| 18 | try expectEqual(lcm(1, 0), 0); |
| 19 | try expectEqual(lcm(-1, 0), 0); |
| 20 | try expectEqual(lcm(0, 1), 0); |
| 21 | try expectEqual(lcm(0, -1), 0); |
| 22 | try expectEqual(lcm(7, 1), 7); |
| 23 | try expectEqual(lcm(7, -1), 7); |
| 24 | try expectEqual(lcm(8, 12), 24); |
| 25 | try expectEqual(lcm(-23, 15), 345); |
| 26 | try expectEqual(lcm(120, 84), 840); |
| 27 | try expectEqual(lcm(84, -120), 840); |
| 28 | try expectEqual(lcm(1216342683557601535506311712, 436522681849110124616458784), 16592536571065866494401400422922201534178938447014944); |
| 29 | } |