summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-03-17 22:03:58 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-03-17 22:03:58 +0400
commitc2a77ceeb15e4ab1d70814ecd97dcbf72be4a0b0 (patch)
tree2ecbbff8622518e0a32bb87bc8e8de213977c658
parentbd08c736df80561de683bde825a4f4feca003898 (diff)
Перевёрнут цикл деления
-rw-r--r--sem2/src/mpn.rs31
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 {