#include<stdio.h>
#include<stdlib.h>
struct frac // Estructura de una fracci¢n
{
int num,den;
};
int MCD(int,int); // Funci¢n que halla el m ximo com£n divisor de dos n£meros.
int compara(const void *,const void *); // Funci¢n de comparaci¢n para el qsort.
int main()
{
int nume,deno,m,total=0,i;
struct frac sol[3010]; // el n£mero de fracciones para 99 es 3003.
freopen("frac.dat","r",stdin); // Abrir los ficheros
freopen("frac.out","w",stdout);
scanf(" %d",&m); // Lee el denominador m ximo
for(deno=2;deno<=m;deno++) // Genera todas las posibles fracciones
for(nume=1;nume<deno;nume++)
if(MCD(nume,deno)==1) // Si es irreducible, esto es, si el
{ // numerador y el denominador son primos entre s¡:
sol[total].num=nume; // A¤adir a las soluciones.
sol[total].den=deno;
total++;
}
qsort(sol,total,sizeof(sol[0]),compara); // Ordenarlas.
for(i=0;i<total;i++) // e imprimirlas.
printf("%d %d\n",sol[i].num,sol[i].den);
return(0);
}
// Funci¢n que halla el m ximo com£n divisor de dos n£meros seg£n el
// algoritmo de Euclides.
int MCD(int a,int b)
{
int r=1;
// a = b*q1 + r1
// b = r1*q1 + r2
// r1 = r2*q1 + r3
// r2 = r3*q1 + r4
// ...
// r_{n-1} = rn*q1 + 0
// Entonces rn es el MCD de a y b.
while(r)
{
r=a%b;
a=b;
b=r;
}
return(a);
}
// Funci¢n de comparaci¢n del qsort.
int compara(const void *a,const void *b)
{
// a c
// - < - <=> a*d < c*b <=> a*d - c*b < 0 (por ser a,b,c y d positivos)
// b d
// a c
// - = - <=> a*d = c*b <=> a*d - c*b = 0
// b d
// a c
// - > - <=> a*d > c*b <=> a*d - c*b > 0 (por ser a,b,c y d positivos)
// b d
// Entonces a*d - c*b es un posible valor que puede devolver la funci¢n:
return((*(struct frac *)a).num*(*(struct frac *)b).den-(*(struct frac *)b).num*(*(struct frac *)a).den);
}
|