From 1c30f42704eca0caabb5e45b09bef817dac47932 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Wed, 10 Aug 2022 19:56:49 +0200 Subject: [PATCH] add 51 WIP --- euler51/Cargo.toml | 9 +++++++ euler51/src/main.rs | 14 +++++++++++ euler51/src/primes.rs | 56 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 euler51/Cargo.toml create mode 100644 euler51/src/main.rs create mode 100644 euler51/src/primes.rs diff --git a/euler51/Cargo.toml b/euler51/Cargo.toml new file mode 100644 index 0000000..ecc6b28 --- /dev/null +++ b/euler51/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "euler51" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +num = "*" diff --git a/euler51/src/main.rs b/euler51/src/main.rs new file mode 100644 index 0000000..db9ad47 --- /dev/null +++ b/euler51/src/main.rs @@ -0,0 +1,14 @@ +mod primes; + +use crate::primes::Primes; + +type Int = i64; + +const MIN_VALUE: Int = 10_000_000; +const MAX_VALUE: Int = 10_010_000; +// const MAX_VALUE: Int = 99_999_999; + +fn main() { + let primes = Primes::get_between(MIN_VALUE, MAX_VALUE); + println!("{}", primes.vector[0]); +} diff --git a/euler51/src/primes.rs b/euler51/src/primes.rs new file mode 100644 index 0000000..64bafe7 --- /dev/null +++ b/euler51/src/primes.rs @@ -0,0 +1,56 @@ +extern crate num; + +use num::FromPrimitive; +use num::Num; +use num::ToPrimitive; +use std::collections::HashSet; +use std::hash::Hash; + +pub struct Primes { + pub vector: Vec, + pub set: HashSet, +} + +impl Primes { + pub fn get_between(min_value: T, max_value: T) -> Self { + Self::from_array( + Self::get_prime_numbers_array(&min_value, &max_value), + &min_value, + &max_value, + ) + } + + fn from_array(array: Vec, min_value: &T, max_value: &T) -> 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] { + vector.push(FromPrimitive::from_usize(number).unwrap()); + set.insert(FromPrimitive::from_usize(number).unwrap()); + } + } + Primes { vector, set } + } + + fn get_prime_numbers_array(min_value: &T, max_value: &T) -> Vec { + // Sieve of Eratosthenes + let mut result = Vec::with_capacity((*max_value - *min_value).to_usize().unwrap()); + + let max_value_usize = max_value.to_usize().unwrap(); + + for number_to_check in 2..(max_value_usize / 2) { + let mut last_number = number_to_check; + loop { + let current_number = last_number + number_to_check; + if current_number >= max_value_usize { + break; + } + result[(current_number - 2) as usize] = false; + last_number = current_number; + } + } + result + } +}