Cod sursa(job #1315985)

Utilizator RaileanuCristian Raileanu Raileanu Data 13 ianuarie 2015 13:35:20
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include<math.h>
using namespace std;
#define MX 500000010
char c[MX] ;
int n,nr;

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()
{
    n=100;

    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
            cout<<i<<" ";
            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++; cout<<i<<" "; }    // numara elementele prime de la sqrt(n) pana la n

    cout<<"\n" <<nr;

    return 0;
}