﻿/* Feladat:

    Beolvasunk egy n-t és n darab racionális számot 
    "számláló nevező" alakban (n <= 100).

    Írjuk ki az irreducibilis alakjukat növekvő sorrendben "számláló / nevező"
    alakban.
*/

#include <iostream>
#include <fstream>
using namespace std;

struct Rac
{
    int szamlalo;
    int nevezo;
};

void kiir(Rac r)
{
    cout << r.szamlalo << " / "
         << r.nevezo << endl;
}

int lnko(int a, int b)
{
    if (a < 0)
        a = -a;
    if (b < 0)
        b = -b;

    if (a == 0)
        return b;

    while (b != 0) {
        int temp = a;
        a = b;
        b = temp % b;
    }

    return a;
}


Rac egyszerusit(Rac r)
{
    int d = lnko(r.szamlalo, r.nevezo);
    r.szamlalo /= d;
    r.nevezo /= d;

    return r;
}


//kisebb(r1,r2) == true  <=>  r1 < r2
bool kisebb(Rac r1, Rac r2)
{
    return r1.szamlalo * r2.nevezo
           < r1.nevezo * r2.szamlalo;
}


void rendez_nov(int n, Rac t[])
    // t[0] ... t[n-1]
{
    for (int i = 0; i < n; i++) {
        for (int j = i+1; j < n; j++) {
            if (kisebb(t[j], t[i])) {
                Rac temp = t[i]; // az egész struktúrát másolja
                t[i] = t[j];
                t[j] = temp;
            }
        }
    }
}


int main()
{
    ifstream bemenet("input.txt");

    int n;
    bemenet >> n;
    Rac szamok[100];

    for (int i = 0; i < n; i++) {
        bemenet >> szamok[i].szamlalo
                >> szamok[i].nevezo;
    }

    rendez_nov(n, szamok);

    for (int i = 0; i < n; i++) {
        szamok[i] = egyszerusit(szamok[i]);
        kiir(szamok[i]);
    }

    return 0;
}

