competitive/tools/
digit_sequence.rs

1pub trait ToDigitSequence: Sized {
2    fn to_digit_sequence(&self) -> Vec<Self>;
3    fn to_digit_sequence_radix(&self, radix: Self) -> Vec<Self>;
4    fn to_digit_sequence_len(&self, len: usize) -> Vec<Self>;
5    fn to_digit_sequence_radix_len(&self, radix: Self, len: usize) -> Vec<Self>;
6}
7
8macro_rules! impl_to_digit_sequence {
9    ($($t:ty)*) => {
10        $(impl ToDigitSequence for $t {
11            fn to_digit_sequence(&self) -> Vec<$t> {
12                self.to_digit_sequence_radix(10)
13            }
14            fn to_digit_sequence_radix(&self, radix: Self) -> Vec<$t> {
15                let mut x = *self;
16                let mut res: Vec<$t> = vec![];
17                while x > 0 {
18                    res.push(x % radix);
19                    x /= radix;
20                }
21                res.reverse();
22                res
23            }
24            fn to_digit_sequence_len(&self, len: usize) -> Vec<$t> {
25                self.to_digit_sequence_radix_len(10, len)
26            }
27            fn to_digit_sequence_radix_len(&self, radix: Self, len: usize) -> Vec<$t> {
28                let mut x = *self;
29                let mut res: Vec<$t> = vec![0; len];
30                for r in res.iter_mut().rev() {
31                    if x == 0 {
32                        break;
33                    }
34                    *r = x % radix;
35                    x /= radix;
36                }
37                res
38            }
39        })*
40    };
41}
42impl_to_digit_sequence!(u8 u16 u32 u64 u128 usize);