Cod sursa(job #548940)

Utilizator aleph0Ionut-Gabriel Radu aleph0 Data 7 martie 2011 22:50:03
Problema Ciurul lui Eratosthenes Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
    FILE *f = fopen("ciur.in","r");
    FILE *g = fopen("ciur.out","w");
    int *v,a,i,k,j,n;
    fscanf(f,"%d",&n);
    v = (int*)calloc(n + 1,sizeof(int));
    a = sqrt(n);
    for(i = 1; i <= a; i++)
        for(j = 1; j <= a; j++){
        k = (i << 2) * i + j * j;
        if(k <= n && (k % 12 == 1 || k % 12 ==5))
            v[k] = (v[k] == 0 ? 1 : 0);
        k = 3 * i * i + j * j;
        if(k <= n && k % 12 == 7)
            v[k] = (v[k] == 0 ? 1 : 0);
        k = 3 * i * i - j * j;
        if(i > j && k <= n && k % 12 == 11)
            v[k] = (v[k] == 0 ? 1 : 0);
    }

    for(i = 5; i <= a; i++)
        if(v[i] == 1){
            k = i * i;
            for(j = k; j <= n; j += k)
                    v[j] = 0;
        }
    v[2] = v[3] = 1;
    k = 0;
    for(i = 1; i <= n; i++)
        if(v[i])
            k++;
    fprintf(g,"%d",k);
    fclose(f);
    fclose(g);
    return 0;
}