From d19e503d4543f765eb0420c86e894f0d0f74377e Mon Sep 17 00:00:00 2001 From: timeshifter Date: Thu, 11 Aug 2022 10:58:26 +0200 Subject: [PATCH] fix generic prime generator for 51 51 is still WIP --- euler51/src/primes.rs | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/euler51/src/primes.rs b/euler51/src/primes.rs index 64bafe7..de2b556 100644 --- a/euler51/src/primes.rs +++ b/euler51/src/primes.rs @@ -13,20 +13,20 @@ pub struct Primes { impl Primes { pub fn get_between(min_value: T, max_value: T) -> Self { + let max_value_usize = max_value.to_usize().unwrap(); + let min_value_usize = min_value.to_usize().unwrap(); Self::from_array( - Self::get_prime_numbers_array(&min_value, &max_value), - &min_value, - &max_value, + Self::get_prime_numbers_array(&min_value_usize, &max_value_usize), + &min_value_usize, + &max_value_usize, ) } - fn from_array(array: Vec, min_value: &T, max_value: &T) -> Self { + fn from_array(array: Vec, min_value: &usize, max_value: &usize) -> Self { let mut vector = Vec::new(); let mut set = HashSet::new(); - let min_value_usize = min_value.to_usize().unwrap(); - let max_value_usize = max_value.to_usize().unwrap(); - for number in min_value_usize..max_value_usize { - if array[(number - min_value_usize) as usize] { + for number in *min_value..*max_value { + if array[(number - min_value) as usize] { vector.push(FromPrimitive::from_usize(number).unwrap()); set.insert(FromPrimitive::from_usize(number).unwrap()); } @@ -34,20 +34,23 @@ impl Primes Primes { vector, set } } - fn get_prime_numbers_array(min_value: &T, max_value: &T) -> Vec { + fn get_prime_numbers_array(min_value: &usize, max_value: &usize) -> Vec { // Sieve of Eratosthenes - let mut result = Vec::with_capacity((*max_value - *min_value).to_usize().unwrap()); + let length = *max_value - *min_value; + let mut result = vec![true; length]; - let max_value_usize = max_value.to_usize().unwrap(); - - for number_to_check in 2..(max_value_usize / 2) { + for number_to_check in 2..(max_value / 2) { let mut last_number = number_to_check; loop { let current_number = last_number + number_to_check; - if current_number >= max_value_usize { + if current_number < *min_value { + last_number = current_number; + continue; + } + if current_number >= *max_value { break; } - result[(current_number - 2) as usize] = false; + result[current_number - min_value] = false; last_number = current_number; } }