From a4d1ce7bca0c2110638275d9e4fd52e723ac0c9c Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Fri, 17 Mar 2023 11:00:45 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=87=D0=B8?= =?UTF-8?q?=D1=81=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sem2/src/mpn.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'sem2/src') 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, } +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 { 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 { + 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; + } +} -- cgit v1.2.3