## Exercice 1

def indices_elements_plus_proches(liste):
    """
    Entrée
    ------
      Une liste d'entiers contenant au moins 2 éléments
    
    Sortie
    ------
      Une paire d'indices distincts (i, j) telle que liste[i] et liste[j]
      sont les deux éléments les plus proches de liste.
    """
    cand_i = 0
    cand_j = 1
    for i in range(len(liste)):
        for j in range(len(liste)):
            ecart_actuel = abs(liste[cand_i] - liste[cand_j])
            alternative  = abs(liste[i] - liste[j]) 
            if i != j and alternative  < ecart_actuel :
                cand_i = i
                cand_j = j
    return (cand_i, cand_j)

## Exercice 2

def division_euclidienne(dividende, diviseur):
    """
    Entrée
    ------
      dividende : un entier naturel
      diviseur  : un entier naturel non-nul

    Sortie
    ------
      Une paire (quotient, reste) telle que
      quotient * diviseur + reste = dividende
      et 0 <= reste < diviseur
    """
    quotient = 0
    reste = dividende
    while reste >= diviseur:
        quotient = quotient + 1
        reste = reste - diviseur
    return (quotient, reste)

## Exercice 3

def zero_fonction(f):
    """
    Entrée
    ------
      f : une fonction strictement croissante,
          qui prend en entrée un entier entre 0 et 100; 
          telle que:
            f(0) est strictement négatif,
            f(100) est strictement positif
            et il existe un entier n entre 0 et 100 pour lequel f(n) vaut 0                  

    Sortie
    ------
      Un entier n compris entre 0 et 100 tel que f(n) vaut 0
    """
    gauche = 0
    droite = 100
    while True:
        milieu = gauche + (droite - gauche)//2
        if f(milieu) == 0:
            return milieu
        elif f(milieu) < 0:
            gauche = milieu
        elif f(milieu) > 0:
            droite = milieu
