Εικάζω πώς στην 1η υλοποίηση μετά την εντολη num = num / gcd(num, den), ακολουθεί η εντολή den = den / gcd(num, den). Εδώ όμως αυτό που συμβαίνει είναι ότι στην δεύτερη εντολή υπολογίζεται άλλος Μέγιστος Κοινός Διαίρετης (η τιμή του num έχει αλλάξει). Άρα διαιρείς τον αριθμητή και τον παρονομαστή με διαφορετικό αριθμό, όποτε το κλάσμα που λαμβάνεις δεν είναι ίσο με το αρχικό.
Θα πρότεινα να ορίσεις μια μεταβλητή που να βάζεις τον gcd και μετά να διαιρείς με αυτή την μεταβλητή τους num και den. (με αυτόν τον τρόπο γλιτώνεις και τον διπλό υπολογισμό του gcd)