1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
pub fn divmod(
    a: i64,
    b: i64,
) -> (i64, i64) {
    assert!(b != 0);

    let (mut q, mut r) = (a / b, a % b);

    if b.signum() * r.signum() == -1 {
        q -= 1;

        r += b;
    }

    (q, r)
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test_divmod() {
        assert_eq!(divmod(10, 3), (3, 1));

        assert_eq!(divmod(10, -3), (-4, -2));

        assert_eq!(divmod(-10, 3), (-4, 2));

        assert_eq!(divmod(-10, -3), (3, -1));
    }
}