Cod sursa(job #516375)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 23 decembrie 2010 20:45:46
Problema Ciurul lui Eratosthenes Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
#include<stdlib.h>
typedef struct nod
{long info;
struct nod *urm;}Nod,*list;

void add(list &l,long x)
{Nod *p,*nou=new Nod;
nou->info=x;
nou->urm=NULL;
if(l==NULL)
      {l=nou;
      return;}
p=l;
while(p->urm!=NULL)
      p=p->urm;
p->urm=nou;}

void del(list &l,long x)
{Nod *p=l,*q=l;
while(p!=NULL&&p->info!=x)
      {q=p;
      p=p->urm;}
if(p!=NULL)
      {if(q==p)
           l=l->urm;
      else
           q->urm=p->urm;
      free(p);}}

int find(list &l,long x)
{Nod *p=l;
while(x>p->info&&p!=NULL)
      p=p->urm;
if(p->info==x)
      return 1;
return 0;}

int main()
{long n,t,j,k,v;
freopen("ciur.in","r",stdin);
freopen("ciur.out","w",stdout);
list l=NULL;
scanf("%ld",&n);
for(j=2;j<=n;j++)
     add(l,j);
k=n-1;
j=2;
v=n;
while(1)
     {if(2*j>v)
          break;
     while(find(l,j)==0)
          j++;
     t=j;
     while(t*j<=v)
          {if(find(l,t*j)==1)
                 {del(l,t*j);
                 if(t*j==v)
                       v--;
                 k--;}
          t++;}
     j++;}    
printf("%ld",k);
return 0;}