Cod sursa(job #1232561)

Utilizator thinkphpAdrian Statescu thinkphp Data 23 septembrie 2014 11:24:02
Problema Ciurul lui Eratosthenes Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#include <memory.h>
#define N 2000001
#define FIN "ciur.in"
#define FOUT "ciur.out"

FILE *fin, 
     *fout;

char sita[ N / 8 + 1];

int checkOne(int n, int p) 
{

    return (sita[ n ] >> p) & 1;
}

void one(int n, int p) 
{

     int mask = 1;

     mask <<= p;

     sita[ n ] |= mask;
}

void Erathostene() 
{

     int i,
         j;

     for( i = 2; i * i <= N; i++ )
     {
           
          if( !checkOne( i / 8, i % 8 ) )
          {
               j = 2;

               while( i * j  <= N ) 
               {
                      one( (i*j) / 8, (i*j) % 8);

                      j++;                       
               }
          }           
     } 
     
};

int isPrime( int n ) 
{
    return !checkOne( n / 8, n % 8 );
}

int main() {

    int i, num, count = 0;
 
    fin = fopen(FIN, "r");

    fout = fopen(FOUT, "w");

    memset(sita, 0, sizeof( sita ));

    Erathostene();

    fscanf(fin, "%d", &num);

    for(i = 2; i <= num; i++) 
    {

        if( isPrime(i) )
        {
            count++;
        }
    }
  
    fprintf(fout, "%d", count);

    fclose( fin ); 
    fclose( fout ); 

    return(0);
};