Cod sursa(job #447660)

Utilizator struanCristian Popovici struan Data 29 aprilie 2010 21:57:20
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.52 kb


#include <iostream>


struct list
{
    list *as;
    long int a;
    long int b;
    list *ad;
};

struct nod
{
    nod *as;
    long int nr;
    nod *ad;
};

nod *p, *c, *u;//variabile globale pentru ciurul lui Eratostene

list *d,*p1,*u1;//variabile globale folosite pentru lista de fractii


void genFractii(long int);
void ciur(long int);
void stergeFractie(list *);
int numarFractii();


using namespace std;

int main()
{
    long int n;
    int nr,nf;

    FILE *f;
    f=fopen("fractii.in","r");
    fscanf(f,"%li",&n);
    fclose(f);
    genFractii(n);
    ciur(n);

    c=p;
    while (c)
    {
        d=p1;
        while (d)
        {
            if ((d->a%c->nr==0)&&(d->b%c->nr==0))
            {
                d=d->as;
                stergeFractie(d->ad);
            }

            d=d->ad;
        }

        c=c->ad;
    }



    nr=numarFractii();
    nf=2*nr+2*n-1;
    f=fopen("fractii.out","w");
    fprintf(f,"%d",nf);
    fclose(f);


    return 0;
}

int numarFractii()
{
    d=p1;
    int i=0;
    while(d)
    {
        i++;
        d=d->ad;
    }
    return i;
}


void stergeFractie(list *d)
{
    list *d1,*d2;

    if (d==p1)
    {
        p1=d->ad;
        p1->as=p1;
        delete d;
    }
    else if (d==u1)
    {
        u1=d->as;
        u1->ad=0;
        delete d;
    }
    else
    {

        d1=d->as;
        d2=d->ad;

        d1->ad=d2;
        d2->as=d1;
        delete d;
    }
}





void genFractii(long int n)
{
    long int i,j;
    list *d1;


    d=new list;
    d->a=2;
    d->b=2;
    d->as=d;
    d->ad=0;
    p1=d;
    u1=d;


    for (i=2;i<=n-1;i++)
    {
        for (j=i+1;j<=n;j++)
        {
            d1=d;
            d=new list;
            d->a=i;
            d->b=j;
            d->ad=0;
            d->as=d1;
            d1->ad=d;
            u1=d;
        }
    }
    stergeFractie(p1);
}

void creareLista(long int n)
{
    long int i;
    nod *c1;
    c=new nod;
    c->nr=2;
    p=c;
    u=c;
    p->as=p;
    u->ad=0;
    for (i=3;i<=n;i++)
    {
        c1=c;
        c=new nod;
        c->nr=i;
        c1->ad=c;
        c->as=c1;
        c->ad=0;
        u=c;
    }
}


void delElem(long int n)
{
    nod *c1,*c2;
    if (n==p->nr)
    {
        c=p;
        p=p->ad;
        p->as=p;
        delete c;
    }

    else if (n==u->nr)
    {
        c=u;
        u=u->as;
        u->ad=0;
        delete c;
    }
    else
    {
        c=new nod;
        c=p;

        while (c->nr<n)
        {
            c=c->ad;
        }

        if (c->nr==n)
        {

            c1=c->as;
            c2=c->ad;

            c1->ad=c2;
            c2->as=c1;

            delete c;
        }
    }
}

bool esteInLista(long int x)
{
    bool cond=false;
    c=p;
    while (c)
    {
        if (c->nr==x) cond=true;
        c=c->ad;
    }
    return cond;
}

void ciur(long int n)
{
    creareLista(n);
    nod *c1,*c2,*cm,*pm,*um,*c1m;
    long int m;

    c1=p;

    while (c1->nr*c1->nr<=u->nr)
    {
        c2=c1;


        cm=new nod;
        cm->nr=c2->nr;
        pm=cm;
        um=cm;
        pm->as=pm;
        um->ad=0;


        while (c2->nr*c1->nr<=u->nr)
        {

            m=c1->nr*c2->nr;
            if (esteInLista(m))
            {

                c1m=cm;
                cm=new nod;
                cm->nr=m;
                c1m->ad=cm;
                cm->as=c1m;
                cm->ad=0;
                um=cm;
            }

            c2=c2->ad;
        };

        cm=pm->ad;
        while (cm)
        {
            delElem(cm->nr);
            cm=cm->ad;
        }

        c1=c1->ad;
    }
}