add 51 WIP
This commit is contained in:
@@ -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 = "*"
|
||||
@@ -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]);
|
||||
}
|
||||
@@ -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<T: Num + ToPrimitive> {
|
||||
pub vector: Vec<T>,
|
||||
pub set: HashSet<T>,
|
||||
}
|
||||
|
||||
impl<T: Num + ToPrimitive + FromPrimitive + Hash + Eq + PartialEq + Copy> Primes<T> {
|
||||
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<bool>, 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<bool> {
|
||||
// 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user