Pagini recente » Cod sursa (job #3297309) | Cod sursa (job #327379) | Cod sursa (job #473185) | Cod sursa (job #3343617) | Cod sursa (job #3302187)
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");
}