use inquire::Text; use rug::{Complete, Integer}; use std::time::Instant; mod mpn; fn main() { let radix = match Text::new("Введите основание системы счисления:").prompt() { Ok(text) => text, Err(_) => return, }; let radix = match radix.parse::() { Ok(number) => { if number > 36 || number < 2 { println!( "Система счисления должна принадлежать отрезку [2,36]" ); return; } number } Err(_) => { println!("Основание должно быть десятичным числом"); return; } }; let a_text = match Text::new("Введите число:").prompt() { Ok(text) => text, Err(_) => return, }; let b_text = match Text::new("Введите число:").prompt() { Ok(text) => text, Err(_) => return, }; let a = match mpn::Number::parse(&a_text, radix as u8) { Ok(number) => number, Err(what) => { println!("{what}"); return; } }; let b = match mpn::Number::parse(&b_text, radix as u8) { Ok(number) => number, Err(what) => { println!("{what}"); return; } }; let a_rug = match Integer::parse_radix(a_text, radix) { Ok(parsed) => parsed.complete(), Err(_) => { println!("Не удалось считать число"); return; } }; let b_rug = match Integer::parse_radix(b_text, radix) { Ok(parsed) => parsed.complete(), Err(_) => { println!("Не удалось считать число"); return; } }; let mpn_start = Instant::now(); let mpn_res = a.div_rem(b); let mpn_elapsed = mpn_start.elapsed(); let rug_start = Instant::now(); if let Ok(_) = &mpn_res { let _rug_res = a_rug.div_rem(b_rug); } let rug_elapsed = rug_start.elapsed(); match mpn_res { Ok((div, rem)) => { println!("Частное: {}", div); println!("Остаток: {}", rem); } Err(msg) => { println!("{msg}"); return; } } println!( "Операция произведения выполнена в mpn за {} наносекунд", mpn_elapsed.as_nanos() ); println!( "Операция произведения выполнена в rug за {} наносекунд", rug_elapsed.as_nanos() ); }