From c2a77ceeb15e4ab1d70814ecd97dcbf72be4a0b0 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Fri, 17 Mar 2023 22:03:58 +0400 Subject: =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D1=91=D1=80=D0=BD=D1=83?= =?UTF-8?q?=D1=82=20=D1=86=D0=B8=D0=BA=D0=BB=20=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sem2/src/mpn.rs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'sem2') diff --git a/sem2/src/mpn.rs b/sem2/src/mpn.rs index b8314e7..df40c24 100644 --- a/sem2/src/mpn.rs +++ b/sem2/src/mpn.rs @@ -17,20 +17,20 @@ impl Clone for Number { } impl Number { - pub fn parse(snum: &str, radix: u8) -> Result { + pub fn parse(snum: &str, radix: u8) -> Result { let snum = snum.as_bytes(); let mut digits = Vec::new(); for i in (0..snum.len()).rev() { match Number::parse_digit(snum[i]) { Some(digit) => { if digit >= radix { - return Err("Аргумент не является числом"); + return Err("Аргумент не является числом".to_string()); } else { digits.push(digit); } } None => { - return Err("Аргумент не является числом"); + return Err("Аргумент не является числом".to_string()); } } } @@ -254,18 +254,21 @@ impl Number { let d = self.radix / (v1 + 1); let mut u = mul_digit(&self.digits, d, self.radix as u8); - let mut v = mul_digit(&other.digits, d, self.radix as u8); - v.pop(); + let v = { + let mut tmp = mul_digit(&other.digits, d, self.radix as u8); + tmp.pop(); + tmp + }; let mut quo = Vec::new(); - for j in 0..=m { - let uj = u[u.len() - 1 - j] as i32; + for j in (0..=m).rev() { + let uj = u[j + n] as i32; let v1 = v[v.len() - 1] as i32; let q = if uj == v1 { b - 1 } else { - let uj1 = u[u.len() - 1 - (j + 1)] as i32; - let uj2 = u[u.len() - 1 - (j + 2)] as i32; + let uj1 = u[j + n - 1] as i32; + let uj2 = u[j + n - 1] as i32; let v2 = v[v.len() - 2] as i32; let mut qc = (uj * b + uj1) / v1; while v2 * qc > (uj * b + uj1 - qc * v1) * b + uj2 { @@ -273,19 +276,19 @@ impl Number { } qc }; - let u_sub = &u[u.len() - 1 - (j + n)..=u.len() - 1 - j]; - let u_sub = - Number::from_digits(&Vec::from(u_sub), self.radix).unwrap(); + + let u_sub = Vec::from(&u[j..=j + n]); + let u_sub = Number::from_digits(&u_sub, self.radix).unwrap(); let qv = Number::from_digits( &mul_digit(&v, q as u8, other.radix), other.radix, ) .unwrap(); + if u_sub >= qv { let p = u_sub - qv; for i in 0..n + 1 { - let idx = u.len() - 1 - (j + n - i); - u[idx] = if i < p.len() { p.digits[i] } else { 0 }; + u[j + i] = if i < p.len() { p.digits[i] } else { 0 }; } quo.push(q as u8); } else { -- cgit v1.2.3