summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-03-17 11:00:45 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-03-17 11:03:17 +0400
commita4d1ce7bca0c2110638275d9e4fd52e723ac0c9c (patch)
treee59428c7eaa7b088121e8bc97062571dc31360b3
parentb88d4c10609a4b14a73df555c85707183c1bf254 (diff)
Добавлены операции сравнения чисел
-rw-r--r--sem2/src/mpn.rs60
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;
+ }
+}