x_math_lib 0.1.0

a tony crate for personal use
Documentation
//! # xtlab
//!
//! 一个自用库。

/// 检查一个数是不是水仙花数
///
/// # Examples
///
/// ```
///
/// let arg = 407;
/// let answer = xtlab::is_narcissistic(arg);
///
/// assert_eq!(true, answer);
/// ```
pub fn is_narcissistic(n: u32) -> bool {
    let digit = get_digits(n as u64);
    let mut v = vec![];
    let mut temp_n = n;
    for _ in 1..=digit {
        v.push(temp_n % 10);
        temp_n /= 10;
    }
    v.iter().fold(0u32, |a, &b| a + b.pow(digit)) == n
}

/// 获取一个数字的位数
///
/// # Examples
///
/// ```
///
/// let arg = 95408;
/// let answer = xtlab::get_digits(arg);
///
/// assert_eq!(5, answer);
/// ```

pub fn get_digits(n: u64) -> u32 {
    let size_table = [
        9,
        99,
        999,
        9999,
        99999,
        999999,
        9999999,
        99999999,
        999999999,
        9999999999,
        99999999999,
        999999999999,
        9999999999999,
        99999999999999,
        999999999999999,
        9999999999999999,
        99999999999999999,
        999999999999999999,
        9999999999999999999,
        u64::max_value(),
    ];
    ((1..).find(|i| n <= size_table[*i]).unwrap() + 1) as u32
}

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        let _: Vec<_> = (1..)
            .filter(|&x| is_narcissistic(x))
            .take(10)
            .map(|x| println!("{}", x))
            .collect();
    }
}