summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-03-18 12:19:07 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-03-18 12:19:07 +0400
commit791688565eb840954b64416fa4fde17c341522bc (patch)
tree2fd2e3d1b15d9f085461c5ab1265e8b1fbcc322e
parent82522a4fde64783073dafd2967ab101ac85219f0 (diff)
Исправлена ошибка при делении
-rw-r--r--sem2/src/mpn.rs40
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();