From b57d081d9bcbe15870ba6d9cf98bb38f188e63ee Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Thu, 16 Feb 2023 21:10:07 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=20=D0=B4?= =?UTF-8?q?=D0=BB=D0=B8=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=B0=D1=80=D0=B8=D1=84?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=B8=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sem2/src/mpn.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 sem2/src/mpn.rs (limited to 'sem2/src/mpn.rs') diff --git a/sem2/src/mpn.rs b/sem2/src/mpn.rs new file mode 100644 index 0000000..27f94e0 --- /dev/null +++ b/sem2/src/mpn.rs @@ -0,0 +1,70 @@ +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, + }; + } +} -- cgit v1.2.3