From e3c5151a8226546ff5c1f186a897f79de8f74eed Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Tue, 30 Aug 2022 17:40:04 +0200 Subject: [PATCH] 51: replace skip with skip_while --- lib/primes/src/lib.rs | 15 +++++++-------- src/euler51/src/main.rs | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/primes/src/lib.rs b/lib/primes/src/lib.rs index dd66f4b..3b2de7a 100644 --- a/lib/primes/src/lib.rs +++ b/lib/primes/src/lib.rs @@ -5,6 +5,7 @@ use std::fmt::Display; use std::fs::File; use std::hash::Hash; use std::io::Write; +use std::slice::Iter; use num::FromPrimitive; use num::Num; @@ -12,7 +13,7 @@ use num::ToPrimitive; #[derive(Clone)] pub struct Primes { - pub vector: Vec, + vector: Vec, set: HashSet, } @@ -58,9 +59,7 @@ where let upper_limit = Self::calc_upper_limit(max_value); for i in 2..upper_limit { - let skip = Self::find_number_to_skip_until_min_value(min_value, i); - - for multiple in (i * i..max_value).step_by(i).skip(skip) { + for multiple in (i * i..max_value).step_by(i).skip_while(|i| i < &min_value) { let idx = multiple - min_value; // SAFETY: `multiple` will always be between min_value and max_value // (which define the length of the array), therfore idx is always smaller than the @@ -76,10 +75,6 @@ where f64::sqrt(max_value as f64).ceil() as usize } - fn find_number_to_skip_until_min_value(min_value: usize, i: usize) -> usize { - ((min_value.saturating_sub(i * i)) as f64 / i as f64).ceil() as usize - } - pub fn remove(&mut self, num: &T) { if let Some(index) = self.vector.iter().position(|x| x == num) { self.vector.remove(index); @@ -107,6 +102,10 @@ where writeln!(f, "{p}").unwrap(); } } + + pub fn iter(&self) -> Iter { + self.vector.iter() + } } #[cfg(test)] diff --git a/src/euler51/src/main.rs b/src/euler51/src/main.rs index 3d1c381..4b1c283 100644 --- a/src/euler51/src/main.rs +++ b/src/euler51/src/main.rs @@ -44,7 +44,7 @@ fn main() { MAX_PATTERN_LENGTH, AMOUNT_OF_DIGITS_IN_NUMBER, ) { - for prime in &all_primes.vector { + for prime in all_primes.iter() { primes_matching_pattern.clear(); let digits = prime.to_digits();