diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2023-03-17 22:03:58 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2023-03-17 22:03:58 +0400 |
| commit | c2a77ceeb15e4ab1d70814ecd97dcbf72be4a0b0 (patch) | |
| tree | 2ecbbff8622518e0a32bb87bc8e8de213977c658 | |
| parent | bd08c736df80561de683bde825a4f4feca003898 (diff) | |
Перевёрнут цикл деления
| -rw-r--r-- | sem2/src/mpn.rs | 31 |
1 files changed, 17 insertions, 14 deletions
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<Number, &str> { + pub fn parse(snum: &str, radix: u8) -> Result<Number, String> { 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 { |