Cod sursa(job #1470156)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 10 august 2015 14:54:10
Problema Ciurul lui Eratosthenes Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>
#include <stdlib.h>

#define iname "ciur.in"
#define oname "ciur.out"
union
{
    char oct[4];
    int val;
}hit[65000];
int N,cnt;
inline int ciuruit(int val)
{
    int i = val / 32, bit = (val % 32), oct = bit / 8, bito = bit % 8;
    char masca = 1 << bito;
    if(hit[i].oct[oct] & masca) return 1;
    return 0;

}
void ciuruie(int val)
{
    int i = val / 32, bit = (val % 32), oct = bit / 8, bito = bit % 8;
    char masca = 1 << bito;
    hit[i].oct[oct] |= masca;
}
int getNumber()
{
    int i, aux;
    for(i = 2; i <= N/2; i++)
        if(!ciuruit(i))
        {
            cnt++;
            aux = i + i;
            while(aux <= N) ciuruie(aux), aux += i;
        }
    for(i = N/2+1; i<= N; i++)
        if(!ciuruit(i)) cnt++;
    return cnt;
}

int main()
{
    FILE *in = fopen(iname, "r");
    FILE *out = fopen(oname, "w");
    fscanf(in,"%d", &N);
    fprintf(out,"%d", getNumber());
    return 0;
}