This commit is contained in:
timeshifter
2025-03-24 17:07:21 +01:00
parent 0327290454
commit feecf962aa
2 changed files with 87 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
[package]
name = "euler47"
version = "0.1.0"
edition = "2024"
[dependencies]
itertools = "0.14.0"
primes = { version = "*", path = "../../lib/primes" }
[dev-dependencies]
rstest = "0.25.0"
+76
View File
@@ -0,0 +1,76 @@
use itertools::Itertools;
use primes::Primes;
const MAX: usize = 1_000_000;
fn main() {
let primes = Primes::get_between(2, MAX);
'outer: for number in 2..MAX {
for i in 0..=3 {
let factors = factorize_unique(number + i, &primes);
if factors.len() != 4 {
continue 'outer;
}
}
println!("{number}");
break;
}
}
fn factorize(n: usize, primes: &Primes<usize>) -> Vec<usize> {
if primes.contains(&n) {
return vec![n];
}
let mut remaining = n;
let mut result = vec![];
'outer: loop {
if remaining == 1 {
break 'outer;
}
'inner: for prime in primes.iter().take_while(|p| **p <= remaining) {
let remainder = remaining % prime;
if remainder == 0 {
result.push(prime.to_owned());
remaining /= prime;
break 'inner;
}
}
}
result
}
fn factorize_unique(n: usize, primes: &Primes<usize>) -> Vec<usize> {
factorize(n, primes).into_iter().unique().collect()
}
#[cfg(test)]
mod tests {
use primes::Primes;
use crate::{factorize, factorize_unique};
use rstest::rstest;
#[rstest]
#[case(14, vec![2, 7])]
#[case(15, vec![3, 5])]
#[case(644, vec![2, 2, 7, 23])]
#[case(645, vec![3, 5, 43])]
#[case(646, vec![2, 17, 19])]
fn factorization(#[case] input: usize, #[case] expected: Vec<usize>) {
let primes = Primes::get_between(2, input);
let result = factorize(input, &primes);
assert_eq!(result, expected);
}
#[rstest]
#[case(644, vec![2, 7, 23])]
#[case(645, vec![3, 5, 43])]
fn factorization_unique(#[case] input: usize, #[case] expected: Vec<usize>) {
let primes = Primes::get_between(2, input);
let result = factorize_unique(input, &primes);
assert_eq!(result, expected);
}
}