use std::cmp::max; use std::fmt; use std::ops::Add; pub struct Number { radix: usize, digits: Vec, } impl Number { pub fn parse(snum: &str) -> Result { let radix = 10_usize; let snum = snum.as_bytes(); let mut digits = Vec::new(); for i in (0..snum.len()).rev() { let digit = snum[i] - '0' as u8; if digit as usize >= radix { return Err("Аргумент не является числом"); } else { digits.push(digit); } } return Ok(Number { radix, digits }); } pub fn len(&self) -> usize { self.digits.len() } } impl fmt::Display for Number { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { for i in (0..self.digits.len()).rev() { write!(f, "{}", self.digits[i])?; } return Ok(()); } } impl Add for Number { type Output = Self; fn add(self, other: Self) -> Self::Output { let mut k = 0; let len = max(self.len(), other.len()); let mut digits = Vec::new(); for i in 0..len { let mut digit = 0; if i < self.len() { digit += self.digits[i] as usize; } if i < other.len() { digit += other.digits[i] as usize; } digit += k; let (div, rem) = (digit / self.radix, digit % self.radix); digit = rem; k = div; digits.push(digit as u8); } if k != 0 { digits.push(k as u8); } return Number { radix: self.radix, digits, }; } }