Aller au contenu

Rendu de monnaie avec 3 types de pièces⚓︎

On s'intéresse au problème du rendu d'une quantité somme_a_rendre de monnaie.

On suppose qu'on dispose d'un nombre infini

  • de billets de 5 euros,
  • de pièces de 2 euros
  • et de pièces de 1 euro.

Le but est d'écrire une fonction nommée rendu dont le paramètre est un entier positif somme_a_rendre qui renvoie un tuple de trois entiers qui correspondent aux nombres de billets de 5 euros de pièces de 2 euros et de pièces de 1 euro à rendre afin que le total rendu soit égal à somme_a_rendre, avec le moins de billets et de pièces possible.

On commencera par rendre le nombre maximal de billets de 5 euros, puis celui des pièces de 2 euros et enfin celui des pièces de 1 euro.

Exemples

  • Pour rendre 7 €, on rend 1 billet de 5 €, 1 pièce de 2 € et 0 pièce de 1 €.
🐍 Console Python
>>> rendu(7)
(1, 1, 0)
  • Pour rendre 10 €, on rend 2 billets de 5 €.
  • Pour rendre 13 €, on rend 2 billets de 5 €, une pièce de 2 € et une pièce de 1 €.
  • Pour rendre 32 €, on rend 6 billets de 5 € et une pièce de 2 €.
🐍 Console Python
>>> rendu(10)
(2, 0, 0)
>>> rendu(13)
(2, 1, 1)
>>> rendu(32)
(6, 1, 0)
###
# testsbksl-nlbksl-nlassert tuple(rendu( 7)) == (1, 1, 0)bksl-nlassert tuple(rendu(10)) == (2, 0, 0)bksl-nlassert tuple(rendu(13)) == (2, 1, 1)bksl-nlassert tuple(rendu(32)) == (6, 1, 0)bksl-nlbksl-nlbksl-nl# autres testsbksl-nlbksl-nldef RENDU(sommepy-undapy-undrendre):bksl-nl npy-und5 = sommepy-undapy-undrendre // 5bksl-nl sommepy-undapy-undrendre -= 5 py-str npy-und5bksl-nlbksl-nl npy-und2 = sommepy-undapy-undrendre // 2bksl-nl sommepy-undapy-undrendre -= 2 py-str npy-und2bksl-nlbksl-nl npy-und1 = sommepy-undapy-undrendrebksl-nl bksl-nl return (npy-und5, npy-und2, npy-und1)bksl-nlbksl-nlfor sommepy-undapy-undrendre in range(50):bksl-nl attendu = RENDU(sommepy-undapy-undrendre)bksl-nl assert tuple(rendu(sommepy-undapy-undrendre)) == attendu, f"Erreur avec le rendu de {sommepy-undapy-undrendre}"bksl-nlbksl-nl 5/5

def rendu(sommepy-undapy-undrendre):bksl-nl ...bksl-nlbksl-nlbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlassert tuple(rendu( 7)) == (1, 1, 0)bksl-nlassert tuple(rendu(10)) == (2, 0, 0)bksl-nlassert tuple(rendu(13)) == (2, 1, 1)bksl-nlassert tuple(rendu(32)) == (6, 1, 0)bksl-nlbksl-nldef rendu(sommepy-undapy-undrendre):bksl-nl npy-und5 = sommepy-undapy-undrendre // 5bksl-nl sommepy-undapy-undrendre -= 5 py-str npy-und5bksl-nlbksl-nl npy-und2 = sommepy-undapy-undrendre // 2bksl-nl sommepy-undapy-undrendre -= 2 py-str npy-und2bksl-nlbksl-nl npy-und1 = sommepy-undapy-undrendrebksl-nl bksl-nl return (npy-und5, npy-und2, npy-und1)bksl-nlbksl-nl

A

Version, avec divmod⚓︎

La fonction divmod renvoie le quotient et le reste d'une division entière.

🐍 Script Python
def rendu(somme_a_rendre):
    n_5, somme_a_rendre = divmod(somme_a_rendre, 5)
    n_2, somme_a_rendre = divmod(somme_a_rendre, 2)
    n_1 = somme_a_rendre

    return (n_5, n_2, n_1)

Version avec une boucle⚓︎

🐍 Script Python
VALEURS = (5, 2, 1)

def rendu(somme_a_rendre):
    resultat = [0] * len(valeurs)
    for i in range(len(valeurs)):
        resultat[i], somme_a_rendre = divmod(somme_a_rendre, VALEURS[i])

    return tuple(retour)

Cette dernière version est utile si on envisage un autre système de pièces avec de nombreuses valeurs.

Z