From 16520d06f57776cfd6c24c1896752acad6e1610f Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Sun, 18 May 2025 19:24:32 +0200 Subject: [PATCH] parse big integer --- src/file.rs | 19 +++++++++++++++---- src/main.rs | 6 +----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/file.rs b/src/file.rs index 71d9f29..1fe4444 100644 --- a/src/file.rs +++ b/src/file.rs @@ -2,6 +2,7 @@ use rug::Integer; use std::fs; use std::io; use std::path::Path; +use std::str::FromStr; pub struct AgcdInput { pub noise_bits: usize, @@ -39,10 +40,20 @@ pub fn parse_file(path: &Path) -> io::Result { // Parse numbers from remaining lines let numbers: Vec = lines - .filter(|line| !line.trim().starts_with("//") && !line.trim().is_empty()) // ignore comment and empty lines - .filter_map(|line| line.trim().parse::().ok()) - .map(Integer::from) - .collect(); + .filter(|line| { + let t = line.trim(); + !t.starts_with("//") && !t.is_empty() + }) + .map(|line| { + let s = line.trim(); + Integer::from_str(s).map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidData, + format!("Failed to parse integer '{}': {}", s, e), + ) + }) + }) + .collect::>()?; if numbers.len() < 2 { return Err(io::Error::new( diff --git a/src/main.rs b/src/main.rs index d4dcd78..ebf1311 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,11 +34,7 @@ fn main() -> std::io::Result<()> { let path = path.as_deref().unwrap_or(Path::new("./input.txt")); let input = parse_file(path)?; - let result = agcd(input.numbers, input.noise_bits); - println!( - "Approximate GCD with noise_bits={}: {}", - input.noise_bits, result - ); + agcd(input.numbers, input.noise_bits); } } Ok(())