# -*- coding:utf-8 -*-

__nom_fichier__ = "fraction"
__author__ = "tinet1"
__date__ = "mars 2018"

"""
Exercice récapitulatif

Fractions

classe Fraction

"""

class Fraction:

    def __init__(self, numerateur = 0, denominateur = 1):
        """
        Méthode constructeur.
        :param numerateur: int
        :param denominateur: int, non nul
        """
        self.num_ = numerateur
        self.den_ = denominateur
        
        self.normalise()
        
    def __repr__(self):
        """
        Surcharge des fonctions str() et print().
        :return: string à afficher à l'écran
        """
        return str(self.num_)+"/"+str(self.den_)
        
    def normalise(self):
        """
        Transforme la fraction sous sa forme normalisée.
        :return: None
        """

        # Le dénominateur doit être > 0, le signe de la fraction est donc attribué au numérateur
        if self.den_ < 0:
            self.num_ = -self.num_
            self.den_ = -self.den_
        
    def __mul__(self,other):
        """
        Surcharge de l'opérateur *
        :param other: Fraction
        :return: produit de deux fractions sous forme normalisée
        """
        produit = Fraction(self.num_*other.num_, self.den_*other.den_)
        produit.normalise()
        
        return produit
        
    def __add__(self, other):
        """
        Surcharge de l'opérateur +
        :param other: Fraction
        :return: somme de deux fractions sous forme normalisée
        """
        
        somme = Fraction(self.num_*other.den_+other.num_*self.den_, self.den_ * other.den_)
        somme.normalise()
        
        return somme
        
    def developpement(self):
        """
        :return: période de la fraction, sous forme d'une liste de chiffres positifs
        """

        # Initialisation
        n = self.num_
        d = self.den_
        
        lquotients = []
        lrestes = []

        # On cherche deux restes identiques
        while n%d not in lrestes:

            # Sauvegarde des restes et des quotients associés
            lrestes.append(n%d)
            
            n = (n%d)*10
            lquotients.append(n//d)

        i = lrestes.index(n%d)

        return lquotients[i:]
        
        
# Validation de la classe Fraction
if __name__ == "__main__":
    
    tiers = Fraction(1,3)
    demi = Fraction(4,8)
    
    print(tiers)
    
    demi.normalise()
    print(demi)
    
    print(tiers*demi)
    
    print(tiers+demi)
    
    print(Fraction(1,9)+Fraction(1,15))
    
    f1 = Fraction(74,14)
    f2 = Fraction(73,6)
    
    print(f1.developpement())
    print(f2.developpement())