diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2023-03-18 12:19:07 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2023-03-18 12:19:07 +0400 |
| commit | 791688565eb840954b64416fa4fde17c341522bc (patch) | |
| tree | 2fd2e3d1b15d9f085461c5ab1265e8b1fbcc322e | |
| parent | 82522a4fde64783073dafd2967ab101ac85219f0 (diff) | |
Исправлена ошибка при делении
| -rw-r--r-- | sem2/src/mpn.rs | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/sem2/src/mpn.rs b/sem2/src/mpn.rs index 742e485..97ba55d 100644 --- a/sem2/src/mpn.rs +++ b/sem2/src/mpn.rs @@ -1,7 +1,8 @@ use std::cmp::{max, Ordering}; use std::fmt; -use std::ops::{Add, Div, Mul, Rem, Sub}; +use std::ops::{Add, Div, Index, IndexMut, Mul, Rem, Sub}; +#[derive(Debug)] pub struct Number { radix: u8, digits: Vec<u8>, @@ -16,6 +17,20 @@ impl Clone for Number { } } +impl Index<usize> for Number { + type Output = u8; + + fn index(&self, idx: usize) -> &Self::Output { + &self.digits[idx] + } +} + +impl IndexMut<usize> for Number { + fn index_mut(&mut self, idx: usize) -> &mut Self::Output { + &mut self.digits[idx] + } +} + impl Number { pub fn parse(snum: &str, radix: u8) -> Result<Number, String> { let snum = snum.as_bytes(); @@ -259,6 +274,7 @@ impl Number { tmp.pop(); tmp }; + let v_number = Number::from_digits(&v, self.radix).unwrap(); let mut quo = Vec::new(); for j in (0..=m).rev() { @@ -270,11 +286,11 @@ impl Number { let uj1 = u[j + n - 1] as i32; let uj2 = u[j + n - 2] 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 { - qc -= 1; + let mut qhat = (uj * b + uj1) / v1; + while v2 * qhat > (uj * b + uj1 - qhat * v1) * b + uj2 { + qhat -= 1; } - qc + qhat }; let u_sub = Vec::from(&u[j..=j + n]); @@ -285,15 +301,15 @@ impl Number { ) .unwrap(); - if u_sub >= qv { - let p = u_sub - qv; - for i in 0..n + 1 { - u[j + i] = if i < p.len() { p.digits[i] } else { 0 }; - } - quo.push(q as u8); + let (p, q) = if u_sub >= qv { + (u_sub - qv, q as u8) } else { - quo.push((q - 1) as u8); + (u_sub + v_number.clone() - qv, (q - 1) as u8) + }; + for i in 0..n + 1 { + u[j + i] = if i < p.len() { p.digits[i] } else { 0 }; } + quo.push(q); } quo.reverse(); |