Cod sursa(job #1315989)

Utilizator RaileanuCristian Raileanu Raileanu Data 13 ianuarie 2015 13:36:31
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include<math.h>
using namespace std;
#define MX 2000010
char c[MX] ;
int n,nr;
ifstream f1("ciur.in");
ofstream f2("ciur.out");

int b(int i)        // intoarce valoare bitului i
{
    int ind;
    short x;
    ind=i/8;
    x=i%8;
    if (!x) x=8;
        else ind++;
    char p=1<<(x-1);
    if (!(p&c[ind] )) return 0;
    return 1;
}

void mark(int i)    // seteaza bitul i cu 1
{
    int ind;
    short x;
    ind=i/8;    // pozitia din array
    x=i%8;      // pozitia din reprezentarea char-ului
    if (!x) x=8;
        else ind++;
    c[ind]|=1<<(x-1);
}

int main()
{
    f1>>n;

    int i,j;
    for (i=2;i<=sqrt(n) ;i++ )           // numara elementele prime de la 2 pana la sqrt(n)
    {
        if (!b(i) )             // daca bitul i e 0
        {
            nr++;               // creste nr de prime
            for (j=2; j*i<=n; j++)
                mark(i*j);          // seteaza bitul i*j cu 1
        }
    }

    for (;i<=n; i++ )
        if (i%2!=0 && !b(i) ) nr++;    // numara elementele prime de la sqrt(n) pana la n

    f2<<nr;
    f2.close();
    return 0;
}