Cod sursa(job #2432472)

Utilizator ShayTeodor Matei Shay Data 23 iunie 2019 20:30:07
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.58 kb
#include <stdio.h>
#include <assert.h>

int sieve(int &n) {
	unsigned char sieve[n / 8 + 1] = {0};
	int counter = 0;

	for (int i = 2 ; i <= n ; ++i) {
		int byte = i / 8;
		int bit = i % 8;

		if ((sieve[byte] & (1 << bit)) == 0) {
			++counter;

			for (int j = 2 * i ; j <= n ; j += i) {
				int byte = j / 8;
				int bit = j % 8;

				sieve[byte] |= (1 << bit);
			}

		}
	}

	return counter;
}

int main() {
	int n, counter;
	freopen("ciur.in", "r", stdin);
	freopen("ciur.out", "w", stdout);
	scanf("%d", &n);
	assert(2 <= n && n <= 2000000);
	printf("%d\n", sieve(n));

	return 0;
}