Calculer le ppcm de deux nombres

Soyez le premier à donner votre avis sur cette source.

Vue 21 440 fois - Téléchargée 487 fois

Description

Le programme calcul le ppcm de deux nombres, c'est à dire le plus petit commun multiple.
Pour ceux qui ne savent pas ce que c'est prenons un exemple, soit deux nombres 18 et 15.
Les multiples de 18 sont {18,36,54,72,90,108......}
Les multiples de 15 sont {15,30,45,60,75,90,105......}

Donc ppcm(18,15) = 90. (90 est commun aux deux listes}

Source / Exemple :


unit ppcm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
close
end;

procedure TForm1.Button1Click(Sender: TObject);
var a,b,i,j,temp : Integer;
var TableauA : array [1..500] of Integer;
var TableauB : array [1..500] of Integer;
begin

a := StrToInt(Edit1.Text);
b := StrToInt(Edit2.Text);

if (a = b)       then
begin
        Edit3.Text := IntToStr(a);
end
else
begin
        {inversion de a et de b}
        if (a>b) then
        begin
        temp := b;
        b := a;
        a := temp;
        end;

for i:=1 to b do
begin
TableauA[i] := i*a;
end;

for i:=1 to a do
begin
TableauB[i] := i*b;
end;

for i:=1 to a do
begin
        for j:=1 to b do
        begin
        if (TableauA[j] = TableauB[i]) then
        begin
        Edit3.Text := IntToStr(TableauA[j]);
        Exit;
        end;
        end;
end;

end;

end;
end.

Conclusion :


On déclare deux tableaux assez grand ou seront stockés les multiples de a dans TableauA et ceux de B dans TableauB.
Une boucle if else:
si a = b alors le ppcm(a,b) = a =b (logique)
sinon
on inverse a et b pour que a soit toujours le plus petit
deux boucles for
une pour remplir TableauA, on va de 1 à b car le dernier élément de TableauA sera a*b qui est forcément un multiple de a et de b.
De même pour remplir TableauB

Les tableau étant remplis on compare chaque éléments des deux tableaux grâce aux deux boucles for imbriqués.
Dans la deuxième boucle for la première fois que l'on rencontre l'égalité on
arrête le programme grâce à Exit afin de ne pas obtenir comme résultat a*b.

Voilà, j'espère que n'est pas été trop confu sinon si vous avez des questions n'hésitez pas à m'écrire un p'tit message!!

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
107
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
20 juillet 2021
3
Sachant que le PPCM de deux nombres est égalau produit de ces deux nombres divisé par le PGCD de ces deux meme nombres
PPCM de a,b = ((axb)Div (PGCD(a,b))).
Pour le calcul du PGCD voir sur le forum il y a une fonction récursive qui fait ça très bien la voici :

Function Pgcd(a,b:Integer): Integer;
// Calcul du Pgcd
Begin
If b = 0 then
Result := a
else
Result := Pgcd(b, a Mod b);
end;
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Autrement, je me suis amusé à réaliser un test comparatif des performances entre le méthode de LoOnEy et la mienne.
Y a pas photo, la méthode de LoOnEy est au moins deux fois plus rapide.

Félicitations à LoOnEy !
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Bien vu LoOnEy !
En réalité, il faut lire :
function PPCM(const a, b : integer):integer;
var i,j : integer;
begin
result:= -1; //not found
for i:=1 to 20 do
for j:=1 to 20 do
if (a * i) = (b * j) then
begin
Result:= a * i;
exit; // <== c'est toute la différence
end;
end;

Un court instant de distraction !
Messages postés
10
Date d'inscription
dimanche 21 septembre 2003
Statut
Membre
Dernière intervention
6 juillet 2009

euh je c pa si j'ai mal compris mais je crois ke Delphiprog a fait une petite erreur car son prog ne sort pa de la boucle sur la première réponse trouvé...
ce ki fait k'il renvoi toujours le dernier resultat et donc pas le plus 'PETIT' commun multiple.....

function ppcm(i,j:integer):integer;
var
min:integer;
begin
if (i>j) then
begin
min:=j;
j:=i;
i:=min;
end;
min:=i;
while((min mod i) <> 0) or ((min mod j)<>0) do
inc(min);
result:=min;
end;

Alors ke la en 3 variables ca renvoi un résultat ki me semble plus korrect... :o)
à moins ke je me trompe... :o(
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
function PPCM(a, b : integer):integer;
var i,j : integer;
begin
result:= -1; //not found
for i:=1 to 20 do
for j:=1 to 20 do
if (a * i) = (b * j) then
begin
Result:= a * i
end;
end;
NB : pas d'utilisation de tableau (seulement 4 variables entières)
NB 2 : function réutilisable depuis n'importe quelle unité d'un projet.

utilisation :
if PPCM(15, 18) <> -1 then
//Résultat trouvé...
Qu'en penses-tu ?
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.