Pagini recente » Profil oldatlantian | Statisticile problemei Unicat | Cod sursa (job #2569069) | Profil oldatlantian | Cod sursa (job #3294518)
#include <fstream>
using namespace std;
inline void del(unsigned char lista[], int nr) {
lista[nr >> 3] &= ~(1 << (nr & 7));
}
inline bool check(unsigned char lista[], int nr) {
return lista[nr >> 3] & (1 << (nr & 7));
}
int count_primes(int n) {
int count = 1, i, j;
int dim = n / 16 + 1;
unsigned char *lista = new unsigned char[dim];
for (i = 0; i < dim; lista[i] = 0xFF, ++i);
for (i = 1; ((i * i) << 1) + (i << 1) <= n; ++i) {
if (check(lista, i)) {
for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= n; j += (i << 1) + 1) {
del(lista, j);
}
}
}
for (i = 1; (i << 1) + 1 <= n; ++i) {
if (check(lista, i)) {
++count;
}
}
delete []lista;
return count;
}
ifstream f("ciur.in");
ofstream g("ciur.out");
int main() {
int n;
f >> n;
g << count_primes(n);
f.close();
g.close();
}