From 24cff611a3a3392cf6938a2641778b2fcc00aaa3 Mon Sep 17 00:00:00 2001 From: timeshifter Date: Wed, 19 Mar 2025 15:21:12 +0100 Subject: [PATCH] 38 --- src/euler38/Cargo.toml | 10 ++++++++ src/euler38/src/main.rs | 52 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/euler38/Cargo.toml create mode 100644 src/euler38/src/main.rs diff --git a/src/euler38/Cargo.toml b/src/euler38/Cargo.toml new file mode 100644 index 0000000..91832f7 --- /dev/null +++ b/src/euler38/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "euler38" +version = "0.1.0" +edition = "2024" + +[dependencies] + +[profile.release] +lto = "thin" +debug = true diff --git a/src/euler38/src/main.rs b/src/euler38/src/main.rs new file mode 100644 index 0000000..fb987a8 --- /dev/null +++ b/src/euler38/src/main.rs @@ -0,0 +1,52 @@ +fn main() { + let mut largest_number = 0; + let mut largest_string = String::new(); + let mut string = String::new(); + for integer in 1..=500_000_000_usize { + string.clear(); + for factor in 1.. { + let number = integer * factor; + string.push_str(&number.to_string()); + let as_number = string.parse::().unwrap(); + + if correct_length(&string) && as_number > largest_number && is_pandigital(&string) { + largest_number = as_number; + largest_string = string.clone(); + break; + } + if too_large(&string) { + break; + } + } + } + println!("{largest_string}"); +} + +fn is_pandigital(s: &str) -> bool { + for c in '1'..='9' { + if !s.contains(c) { + return false; + } + } + true +} + +fn correct_length(s: &str) -> bool { + s.len() == 9 +} + +fn too_large(s: &str) -> bool { + s.len() > 9 +} + +#[cfg(test)] +mod tests { + use crate::is_pandigital; + + #[test] + fn test_pandigital() { + assert!(is_pandigital(&192384576.to_string())); + assert!(is_pandigital(&918273645.to_string())); + assert!(!is_pandigital(&9.to_string())); + } +}