Hi, I have encountered with a bizarre problem. Though i solved it in a different way, i can't understand why the problem occurs.
Here is the problematic code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct frac {
int ust;
int alt;
} frac;
frac fracs[13100];
frac fracs2[13100];
int cmp(const void *a,const void *b) {
return ((frac*)a)->ust * ((frac*)b)->alt - ((frac*)a)->alt * ((frac*)b)->ust;
}
FILE *in,*out;
void qs(int alt,int ust);
int main() {
int num,i,j,x=1,y=0,m,n,f,g;
clock_t a,b;
frac z;
a=clock();
in=fopen("frac1.in","r");
out = fopen("frac1.out","w");
fscanf(in,"%d",&num);
/*num=4;*/
fracs[0].alt = 1;
fracs[0].ust=0;
for (i=1;i<=num;i++) {
fracs[x].alt = i;
fracs[x].ust=1;
x++;
}
for (i=3;i<=num;i++) {
for (j=2; j<i; j++) {
n=j;
for (m=2; m<=n;m++) {
if (!(i%m) && !(j%m)) {
j++;
break;
}
}
if (i%j == 0) {
fracs[x].alt = i/j;
fracs[x].ust=1;
x++;
} else {
fracs[x].alt = i;
fracs[x].ust=j;
x++;
}
}
}
for (i=0;i<=x;i++) {
m=fracs[i].ust;
for (j=2;j<=m;j++) {
if (!(fracs[i].alt%j) && !(fracs[i].ust%j)) {
fracs[i].ust =fracs[i].ust/j;
fracs[i].alt =fracs[i].alt/j;
}
}
}
qsort(fracs,x,sizeof(fracs[0]),cmp);
/*for (i=0;i<x;i++) printf("%d / %d \n", fracs[i].ust,fracs[i].alt);*/
fracs2[0] = fracs[0];
for (i=1;i<x;i++) {
if ( (fracs2[y].alt) * (fracs[i].ust) == (fracs2[y].ust) * (fracs[i].alt)) fracs2[y] = fracs[i];
else ++y,fracs2[y] = fracs[i],fprintf(out,"%d/%d\n", fracs2[y-1].ust,fracs2[y-1].alt);
}
fprintf(out,"%d/%d\n", fracs2[y].ust,fracs2[y].alt);
b=clock();
printf("\n\n---%f---\n",((float)(a-b)/1000));
return 0;
}
This way, the values in structure cannot be changed! when i changed the bold part with this code, the problem is solved!:
Code:
for (i=0;i<=x;i++) {
m=fracs[i].ust;
g = fracs[i].alt;
for (j=2;j<=m;j++) {
if (!(g%j) && !(m%j)) {
fracs[i].ust =m/j;
fracs[i].alt =g/j;
}
}
}
I couldn't figure out where i am mistaken.
Thanks in prior
Regards