Pagini recente » Cod sursa (job #604311) | Cod sursa (job #1896475) | Cod sursa (job #1156576) | Cod sursa (job #170074) | Cod sursa (job #447660)
Cod sursa(job #447660)
#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;
}
}