Cod sursa(job #3302187)

Utilizator luiz_felipeLuiz Felipe luiz_felipe Data 4 iulie 2025 16:30:58
Problema Ciurul lui Eratosthenes Scor 100
Compilator rs Status done
Runda Arhiva educationala Marime 1.48 kb
use std::fs::File;
use std::io::{BufReader, BufWriter, BufRead, Write};

fn del(bitmap: &mut [u8], index: usize) {
    bitmap[index >> 3] &= !(1 << (index & 7));
}

fn check(bitmap: &[u8], index: usize) -> bool {
    bitmap[index >> 3] & (1 << (index & 7)) != 0
}

fn count_primes(n: usize) -> usize {
    if n < 2 {
        return 0;
    }

    let size = n / 16 + 1; // only odd numbers
    let mut bitmap = vec![0xFFu8; size]; // all 1 → all odd numbers considerated primes
    let mut count = 1; // 2 este prim

    let limit = (((n as f64).sqrt() as usize) - 1) / 2; // equivalent with sqrt(n) pentru odd numbers index

    for i in 1..=limit {
        if check(&bitmap, i) {
            let p = 2 * i + 1;
            let mut j = i * (i + 1) * 2;
            while (2 * j + 1) <= n {
                del(&mut bitmap, j);
                j += p;
            }
        }
    }

    for i in 1..=((n - 1) / 2) {
        if check(&bitmap, i) {
            count += 1;
        }
    }

    count
}

fn main() {
    let input = File::open("ciur.in").expect("Couldn't open ciur.in");
    let mut reader = BufReader::new(input);
    let mut line = String::new();
    reader.read_line(&mut line).expect("Couldn't read line");
    let n: usize = line.trim().parse().expect("Couldn't parse number");

    let result = count_primes(n);

    let output = File::create("ciur.out").expect("Couldn't create ciur.out");
    let mut writer = BufWriter::new(output);
    writeln!(writer, "{}", result).expect("Write error");
}