diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2023-02-16 21:10:07 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2023-02-16 21:10:07 +0400 |
| commit | b57d081d9bcbe15870ba6d9cf98bb38f188e63ee (patch) | |
| tree | f1b5a355f07e22e886942369db922b380c0f05ce /sem2/src/mpn.rs | |
| parent | f21a1a5de7910503d3dc2a96134d994ec8905708 (diff) | |
Добавлено задание с длинной арифметикой
Diffstat (limited to 'sem2/src/mpn.rs')
| -rw-r--r-- | sem2/src/mpn.rs | 70 |
1 files changed, 70 insertions, 0 deletions
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<u8>, +} + +impl Number { + pub fn parse(snum: &str) -> Result<Number, &str> { + 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, + }; + } +} |