use std::io;
 
// from
// stackoverflow.com/questions/73682463/
// my-prime-number-sieve-is-extremely-slow-even-with-release
 
// edited by stackoverflow.com/users/849891/will-ness
 
pub fn number_to_vector(number: i32) -> Vec<i32> {
    let mut numbers: Vec<i32> = Vec::new();
 
    for i in 1..number + 1 {
        numbers.push(i);
    }
 
    return numbers;
}
 
 
pub fn get_user_input(prompt: &str) -> i32 {
    println!("{}", prompt);
 
    let mut user_input: String = String::new();
 
    io::stdin().read_line(&mut user_input).expect("Failed to read line");
 
    let number: i32 = user_input.trim().parse().expect("Please enter an integer!");
 
    return number;
}
 
 
fn main() {
    let user_input: i32 = get_user_input("Enter a positive integer: ");
    let mut numbers: Vec<i32> = number_to_vector(user_input);
    numbers.
remove(numbers.
iter().
position(|x
| *x 
== 1).
unwrap());    let mut numbers_to_remove: Vec<i32> = Vec::new();
    let mut primes: Vec<i32> = Vec::new();
    let mut i = 0;
 
    let ceiling_root
: i32 
= (user_input as f64
).
sqrt().
ceil() as i32
; 
    for i in 2..ceiling_root + 1 {
        for j in i..(user_input/i) + 1 {
            numbers_to_remove.push(i * j);
        }
    }
 
    numbers_to_remove.sort_unstable();
    numbers_to_remove.dedup();
    //numbers_to_remove.retain(|x| *x <= user_input);
 
    /* for n in numbers_to_remove {
        if numbers.iter().any(|&i| i == n) {
            numbers.remove(numbers.iter().position(|x| *x == n).unwrap());
        }
    } */
 
    for n in numbers {
    	if n < numbers_to_remove[i] {
    		primes.push(n);
    	}
    	else {
    		i += 1;
    	}
    }
 
    //println!("Prime numbers up to {}: {:?}", user_input, numbers);
 
    println!("Last prime number up to {}: {:?}", user_input, primes.last());
    println!("Total prime numbers up to {}: {:?}", user_input, 
         primes.iter().count());
}