#include <iostream>
#include <cmath>  // For abs function

using namespace std;

typedef struct {
    int numeratore;
    int denominatore;
} frazione;

frazione somma(frazione frazione1, frazione frazione2);
frazione semplificazione(frazione frazione);
void stampaFrazione(frazione frazione);
int mcd(int a, int b);

int main(void) {
    frazione frazione1;
    frazione frazione2;

    cout << "Inserisci il numeratore della prima frazione: ";
    cin >> frazione1.numeratore;

    cout << "Inserisci il denominatore della prima frazione: ";
    cin >> frazione1.denominatore;

    cout << endl;

    cout << "Inserisci il numeratore della seconda frazione: ";
    cin >> frazione2.numeratore;

    cout << "Inserisci il denominatore della seconda frazione: ";
    cin >> frazione2.denominatore;

    cout << endl;

    cout << "Prima frazione: ";
    stampaFrazione(frazione1);

    cout << "Seconda frazione: ";
    stampaFrazione(frazione2);

    cout << endl;

    frazione sommaFrazione = somma(frazione1, frazione2);
    frazione sommaSemplificata = semplificazione(sommaFrazione);
    cout << "Somma delle due frazioni semplificata: ";
    stampaFrazione(sommaSemplificata);

    return 0;
}

frazione somma(frazione frazione1, frazione frazione2) {
    int numeratore = frazione1.numeratore * frazione2.denominatore + frazione2.numeratore * frazione1.denominatore;
    int denominatore = frazione1.denominatore * frazione2.denominatore;
    return frazione {numeratore, denominatore};
}

frazione semplificazione(frazione frazione) {
    int gcdValue = mcd(abs(frazione.numeratore), abs(frazione.denominatore));
    frazione.numeratore /= gcdValue;
    frazione.denominatore /= gcdValue;
    return frazione;
}

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

void stampaFrazione(frazione frazione) {
    cout << frazione.numeratore << "/" << frazione.denominatore << endl;
}