Imprimer
Catégorie : Programmation Python - STAV
Affichages : 5113

Objectif

Réaliser un programme permettant de calculer le Plus Grand Commun Diviseur en utilisant l'algorithme d'Euclide avec l'IDE Thonny.

Pour comprendre Euclide, liens vers une vidéo décrivant son fonctionnement: https://youtu.be/EVQY8DG5_es

Un exemple:

>>> %Run pgcd1.py
Saisir le premier nombre entier: 5120
Saisir le second nombre entier: 785
Le PGCD entre  5120  et  785 est donc  5
Les diviseurs de  5120  sont  [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5]
Les diviseurs de  785  sont  [1, 5, 157]

Procédure

Etape 1 - Algorigrammer

Réaliser un schéma logique de votre programme. Pour vous aidez:

Mon schéma logique ressemble à cela:

#saisie des paramètres grand nbre et petit nombre
gdnbre= 525
ptnbre=390

#
#Rappel:
# dividende  |  diviseur 
#            |-----------
#            |  quotient
#    reste   |
#
#initialisation des listes
compteur i=0
quotient
reste
diviseur
dividende
#

#boucle de calcul - tant que le reste diff de 0
calcul du quotient => // division entière
ajouter le quotient calculé dans la liste quotient
calcul du reste => % modulo
ajouter le reste calculé dans la liste reste

affectation des nouvelles valeurs pour la division suivante:
le dernier diviseur devient le prochain dividende
le dernier reste devient le prochain diviseur

#Afficher 
PGCD = le dernier des dividendes

 

Etape 2 - Scripter

L'idée est de réaliser ici un premier jet. Priorité aux boucles et aux variables. Vous noterez l'usage des listes sous python. Pour vous aider voir ici: https://www.courspython.com/introduction-python.html#quelques-bases-rapides-en-python

# PGCD
#saisie des nbres
gnbre=525
pnbre=390

# declaration des listes pour garder une trace
dividende=[]
diviseur=[]
quotient=[]
reste=[]


# initialisation
i=0
r=1
dividende.append(gnbre)
diviseur.append(pnbre)


# boucle
while r!=0:
    q=dividende[i]//diviseur[i]
    r=dividende[i]%diviseur[i]

    quotient.append(q)
    reste.append(r)

    dividende.append(diviseur[i])
    diviseur.append(r)
    i=i+1



# Affichage
print("Le PGCD entre est donc ",dividende[-1])

 

Etape 3 - Améliorer et commenter

Tout est perfectible, pour ici je dirais:

# PGCD
# Version 2

#saisie des 2 nbres
a=int(input("Saisir le premier nombre entier: "))
b=int(input("Saisir le second nombre entier: "))


# classement et definition de gnbre et pnbre
if a<b:
    gnbre=b
    pnbre=a
else:
    gnbre=a
    pnbre=b

# declaration des listes pour garder une trace
dividende=[]
diviseur=[]
quotient=[]
reste=[]


# initialisation
i=0
r=1
dividende.append(gnbre)
diviseur.append(pnbre)


# boucle
while r!=0:
    q=dividende[i]//diviseur[i]
    r=dividende[i]%diviseur[i]

    quotient.append(q)
    reste.append(r)

    dividende.append(diviseur[i])
    diviseur.append(r)
    i=i+1



# Affichage
print("Le PGCD entre ",a," et ",b, "est donc ",dividende[-1])

 

Etape 4 - Affichage complémentaire

 

Pour mieux comprendre le PGCD, afficher aussi la liste des diviseurs de a et de b.

Prenez par exemple a= 4 277 700 et b=52 500 (ne pas saisir les espaces!)

# PGCD
# Version 3

#saisie des 2 nbres
a=int(input("Saisir le premier nombre entier: "))
b=int(input("Saisir le second nombre entier: "))


# classement et definition de gnbre et pnbre
if a<b:
    gnbre=b
    pnbre=a
else:
    gnbre=a
    pnbre=b

# declaration des listes pour garder une trace
dividende=[]
diviseur=[]
quotient=[]
reste=[]


# initialisation
i=0
r=1
dividende.append(gnbre)
diviseur.append(pnbre)


# boucle
while r!=0:
    q=dividende[i]//diviseur[i]
    r=dividende[i]%diviseur[i]

    quotient.append(q)
    reste.append(r)

    dividende.append(diviseur[i])
    diviseur.append(r)
    i=i+1



# Affichage
print("Le PGCD entre ",a," et ",b, "est donc ",dividende[-1])



# Pour  vérif, affichage des diviseurs de a et de b
i=2
aini=a
diviseura=[1]

while i<=a:
    if a%i ==0:
        diviseura.append(i)
        a=a/i
    else:
        i=i+1
print("Les diviseurs de ",aini," sont ",diviseura)





i=2
bini=b
diviseurb=[1]

while i<=b:
    if b%i ==0:
        diviseurb.append(i)
        b=b/i
    else:
        i=i+1
print("Les diviseurs de ",bini," sont ",diviseurb)