CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Calcul du PGCD avec algorithme d'Euclide

G_naoj
G_naoj
Niveau 8
26 avril 2010 à 21:26:57

Bonsoir :) ,
Je suis un peu débutant en programmation en C.
Mon prof de maths m'a donné l'idée de faire un programme avec lequel je puisse obtenir le PGCD (http://fr.wikipedia.org/wiki/PGCD pour les incultes :noel: ) de deux nombres.
Le principe, c'est d'utiliser l'algorithme d'Euclide (aussi appelé algorithme des divisions successives) qui consiste à obtenir le reste de la division Euclidienne de 2 entiers, puis de diviser ce reste par le diviseur, etc... jusqu'à ce qu'on obtienne 0 comme reste.
Le PGCD est alors le dernier reste non-nul (1 si les nombres sont premiers entre eux)
J'ai donc commencé le code, mais je bloque lorsque je dois reprendre le diviseur pour diviser le reste.
J'pense que certains passages sont mal expliqués, donc demandez plus d'infos :-)))

guyver2
guyver2
Niveau 10
26 avril 2010 à 21:53:33

"puis de diviser ce reste par le diviseur"

désolé mais quelqu'un qui se considère comme non inculte devrai savoir que c'est l'inverse, il faut diviser le précédent diviseur par le reste obtenu.

Pour ce qui concerne tes soucis d'implémentation, dis nous ce qui te pose problème.

infos basique :
//division entière en C
int a = 15, b = 6;
int c = a/b; // ici c vaut 2
// reste de la division euclidienne (modulo)
int r = a%b; // ici r vaut 3

chris_27
chris_27
Niveau 10
27 avril 2010 à 00:21:33

Attention ! À mon souvenir, la version de l'algorithme d'Euclide sur Wikipedia est moisie de chez moisie.

J'ai pas spécialement envie de t'aider (surtout parce que je risque de te donner direct la réponse en fait :( ). Essaie déjà de calculer le pgcd de 1664 et 1742 à la main à coup de divisions euclidiennes successives.

guyver2
guyver2
Niveau 10
27 avril 2010 à 00:31:46

j'ai pas lu les algos fournis par la wikipedia mais ce schéma est tout a fait correct : http://fr.wikipedia.org/wiki/Fichier:PGCD.png

et aussi, joli nombre choisi au hasard :)

chris_27
chris_27
Niveau 10
27 avril 2010 à 01:06:22

Il est correct pour les hypothèses qu'il se donne, mais : que faire si a<b ? si a=0 ? si on a des nombres négatifs (ce qui peut être utile pour accélérer un poil l'algorithme) ? etc.

guyver2
guyver2
Niveau 10
27 avril 2010 à 19:07:57

le diagramme spécifie clairement a et b entiers naturels non nuls et a > b

G_naoj
G_naoj
Niveau 8
28 avril 2010 à 13:05:35

Le shéma de guyver2 est exactement ce que je cherche à faire :ok:
Mais moi, ce que je voudrait savoir c'est comment faire pour que a prenne la valeur de b et b celle de r ? en C hein

chris_27
chris_27
Niveau 10
28 avril 2010 à 14:44:19

Pour ça, tu as deux méthodes. Tu veux la méthode standard, ou celle du panda des montagnes de Chine ? :-)

G_naoj
G_naoj
Niveau 8
28 avril 2010 à 15:04:17

Je pense que la standarde suffira :hap:

chris_27
chris_27
Niveau 10
28 avril 2010 à 15:58:35

Alors utilise une variable temporaire qui sert de tampon :

int t;

[…]

t = a;
a = b;
b = t;

[…]

chris_27
chris_27
Niveau 10
28 avril 2010 à 16:00:54

Hum, je suis en train de me dire que c'est encore plus facile qu'échanger les valuers de a et b ce que tu veux faire en fait. Enfin bon, je te laisse le soin d'adapter ce que je viens de poster, ça ne te fera pas de mal de réfléchir un peu. :sournois:

G_naoj
G_naoj
Niveau 8
28 avril 2010 à 17:24:59

Arf, j'y arrive pas, et c'est pas faute d'avoir essayé :-(
Voici mon code:

int main()
{
int a=1375;
int b=644;
int r;
do
{
r= a%b;
if (r=0)
{
printf("PGCD = %d", b);
}
else
{
a=b;
b=r;
}
}
while (r != 0);
return 0;
}

Je ne sait pas vraiment comment faire pour la vérification du reste s'il est égal à 0 :(

chris_27
chris_27
Niveau 10
28 avril 2010 à 18:14:06

« if (r=0) » :g) :g) :g) Hahahaha :rire:

(désolé, c'est nerveux. :rouge: )

En tout cas, cette ligne là ne teste pas si r est nul, et tu vas toujours partir dans la branche else du if (et le while est toujours faux).
Si tu veux mon avis, tu ferais mieux de faire l'affichage après la boucle do-while. C'est bien plus facile. :-)))

G_naoj
G_naoj
Niveau 8
28 avril 2010 à 20:32:01

Oui, quelle erreur :honte: pas besoin de dire désolé, j'en ris moi-même :(
C'est donc if (r==0)

Et une fois cette ligne changée, ça marche :noel:
Mais je comprend pas trop ce que tu veux dire dans tes 2 dernières phrases :(

chris_27
chris_27
Niveau 10
29 avril 2010 à 09:28:57

Je veux dire que ça c'est plus simple :

int main()
{
int a=1375;
int b=644;
int r;
do
{
r= a%b;
a=b;
b=r;
} while (r != 0);
printf("PGCD = %d\n", b);
return 0;
}

:-)))

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment