diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2023-03-17 11:00:45 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2023-03-17 11:03:17 +0400 |
| commit | a4d1ce7bca0c2110638275d9e4fd52e723ac0c9c (patch) | |
| tree | e59428c7eaa7b088121e8bc97062571dc31360b3 /sem2/src/mpn.rs | |
| parent | b88d4c10609a4b14a73df555c85707183c1bf254 (diff) | |
Добавлены операции сравнения чисел
Diffstat (limited to 'sem2/src/mpn.rs')
| -rw-r--r-- | sem2/src/mpn.rs | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/sem2/src/mpn.rs b/sem2/src/mpn.rs index ff54c2b..cd8ecdf 100644 --- a/sem2/src/mpn.rs +++ b/sem2/src/mpn.rs @@ -1,4 +1,4 @@ -use std::cmp::max; +use std::cmp::{max, Ordering}; use std::fmt; use std::ops::{Add, Div, Mul, Sub}; @@ -7,6 +7,15 @@ pub struct Number { digits: Vec<u8>, } +impl Clone for Number { + fn clone(&self) -> Self { + Number { + radix: self.radix, + digits: self.digits.clone(), + } + } +} + impl Number { pub fn parse(snum: &str, radix: usize) -> Result<Number, &str> { let snum = snum.as_bytes(); @@ -251,3 +260,52 @@ impl Div for Number { .fix_leading_zeros(); } } + +impl PartialEq for Number { + fn eq(&self, other: &Self) -> bool { + if self.len() != other.len() { + return false; + } + + for i in 0..self.len() { + if self.digits[i] != other.digits[i] { + return false; + } + } + + return true; + } +} + +impl Eq for Number {} + +impl PartialOrd for Number { + fn partial_cmp(&self, other: &Self) -> Option<Ordering> { + Some(self.cmp(other)) + } +} + +impl Ord for Number { + fn cmp(&self, other: &Self) -> Ordering { + if self == other { + return Ordering::Equal; + } + + if self.len() < other.len() { + return Ordering::Less; + } + + if self.len() > other.len() { + return Ordering::Greater; + } + + for i in 0..self.len() { + let l = self.digits[i]; + let r = other.digits[i]; + if l != r { + return l.cmp(&r); + } + } + return Ordering::Equal; + } +} |