summaryrefslogtreecommitdiff
path: root/sem2/src/mpn.rs
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-02-16 21:10:07 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-02-16 21:10:07 +0400
commitb57d081d9bcbe15870ba6d9cf98bb38f188e63ee (patch)
treef1b5a355f07e22e886942369db922b380c0f05ce /sem2/src/mpn.rs
parentf21a1a5de7910503d3dc2a96134d994ec8905708 (diff)
Добавлено задание с длинной арифметикой
Diffstat (limited to 'sem2/src/mpn.rs')
-rw-r--r--sem2/src/mpn.rs70
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,
+ };
+ }
+}