#! /bin/sh //usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit use std::cmp::min; use std::collections::{HashSet, VecDeque}; use std::iter::FromIterator; #[test] fn test_ex1() { assert_eq!(primecount(10), 4); } #[test] fn test_ex2() { assert_eq!(primecount(15), 6); } #[test] fn test_ex3() { assert_eq!(primecount(1), 0); } #[test] fn test_ex4() { assert_eq!(primecount(25), 9); } fn genprimes(mx: usize) -> Vec { let mut primesh: HashSet = HashSet::from_iter(2..=min(mx, 3)); for i in (6..=mx).step_by(6) { for j in [i - 1, i + 1] { if j < mx { primesh.insert(j); } } } let mut q = VecDeque::from([2, 3, 5, 7]); let mut p = q.pop_front().unwrap(); let mr = (mx as f64).sqrt() as usize; while p <= mr { if primesh.contains(&p) { for i in (p * p..=mx).step_by(p as usize) { primesh.remove(&i); } } if q.len() < 2 { let t = q[0] + 4; q.push_back(t); q.push_back(t + 2); } p = q.pop_front().unwrap(); } let mut primes = primesh.iter().map(|i| *i).collect::>(); primes.sort(); primes } fn primecount(l: usize) -> usize { genprimes(l - 1).len() }