use crate::Solution;
use pmath::primes::sieve_of_eratosthenes;
use std::collections::HashSet;
problem!(Problem0050, 50, "Consecutive Prime Sum");
impl Solution for Problem0050 {
fn solve(&self) -> String {
const LIMIT: u64 = 1_000_000;
let primes = sieve_of_eratosthenes(LIMIT - 1); let primes_set = primes.iter().copied().collect::<HashSet<_>>(); let biggest_prime = primes[primes.len() - 1];
let mut sum: u64 = 0; let mut i: usize = 0; let mut j: usize = 0; while sum <= biggest_prime {
sum += primes[j];
j += 1;
}
let mut flag = true;
'outer: loop {
if flag {
sum -= primes[j - 1];
j -= 1;
while sum < biggest_prime {
if primes_set.contains(&sum) {
break 'outer;
}
sum += primes[j];
j += 1;
sum -= primes[i];
i += 1;
}
if primes_set.contains(&sum) {
break 'outer;
}
flag = false;
} else {
sum -= primes[i];
i += 1;
while i > 0 {
if primes_set.contains(&sum) {
break 'outer;
}
sum -= primes[j - 1];
j -= 1;
sum += primes[i - 1];
i -= 1;
}
if primes_set.contains(&sum) {
break 'outer;
}
flag = true;
}
}
sum.to_string()
}
}