Page 1 sur 1
PGCD
Publié : mer. 24/mars/2004 20:43
par Heis Spiter
Voila un bout de code (à déconseiller au non matheux) qui retourne le PGCD de deux nombres ! Bon j'ai pas pu super bien débugger puisque windows plante avec pas mal de valeurs...
10; 5; pas de problème
13; 7; pas de problème
44; 89; plantage
25; 10; plantage
Je sais pas ou est le blème...
Code : Tout sélectionner
Procedure PGCD(number1.l, number2.l)
If number2 > number1
number3 = number1
number1 = number2
number2 = number3
EndIf
result = 2
While result <> 0
i=0
reste = number1 % number2
quotient = number1/number2
If reste = 0
If i = 0
ProcedureReturn number2
Else
ProcedureReturn reste2
EndIf
result=0
EndIf
number2 = quotient
number1 = reste
reste2 = reste
i = i + 1
Wend
EndProcedure
Publié : mer. 24/mars/2004 20:53
par Heis Spiter
J'ai trouvé le bug... Je mettais planté dans les attributions en bas

Et aussi i qui était mal placé
Code : Tout sélectionner
Procedure PGCD(number1.l, number2.l)
If number2 > number1
number3 = number1
number1 = number2
number2 = number3
EndIf
result = 2
i=0
While result <> 0
reste = number1 % number2
quotient = number1/number2
If reste = 0
If i = 0
ProcedureReturn number2
Else
ProcedureReturn reste2
EndIf
result=0
EndIf
number1 = number2
number2 = reste
reste2 = reste
i = i + 1
Wend
EndProcedure
PS : Ne croyez pas que je sois matheux (quoique), mais depuis le temps que je veux le faire...

Publié : mer. 24/mars/2004 21:05
par Oliv
On accuse windows à tord et à travers
Bon, plus sérieusement, va voir sur le musée il me semble qu'il y a une aure méthode
Publié : mer. 24/mars/2004 21:08
par Heis Spiter
Publié : mer. 24/mars/2004 21:13
par Heis Spiter
J'arrive pô à trouver... Faut dire que la recherche IPB... Ca cherche pas grand chose... Bon ok j'arrete

Publié : mer. 24/mars/2004 21:27
par filperj
J'ai une méthode plus bourrine...
Code : Tout sélectionner
Procedure.l intabs(n)
If n<0
ProcedureReturn -n
Else
ProcedureReturn n
EndIf
EndProcedure
Procedure.l pgcd(a,b)
If a=0 Or b=0 : ProcedureReturn 0 : EndIf
a=intabs(a)
b=intabs(b)
If a<b
r=a
a=b
b=r
Else
r=b
EndIf
Repeat
If a%r=0 And b%r=0
ProcedureReturn r
Else
r-1
EndIf
ForEver
EndProcedure
OpenConsole()
Repeat
PrintN("")
a=Val(Input()) : PrintN("")
b=Val(Input()) : PrintN("")
c=pgcd(a,b)
PrintN(Str(c))
ForEver
Mais je ne sais pas si je fais bien de ne retenir que les valeurs absolues

Publié : mer. 24/mars/2004 21:31
par Heis Spiter
POurquoi vous venez tous casser ma baraque :tusors: Pas mal comme méthode... Meme si je préfére la mienne

Publié : mer. 24/mars/2004 21:32
par Oliv
Effectivement je m'étais trompé de forum, un code de Dr.Dri que j'ai convertit en PB:
Code : Tout sélectionner
a=1581
b=1580
Procedure PGCD(i, j)
i=Abs(i)
j=Abs(j)
Repeat
If i>j
i = i-j
Else
j = j-i
EndIf
Until i=j
ProcedureReturn i
EndProcedure
c = PGCD(a, b)
Debug "a = " + Str(a)
Debug "b = " + Str(b)
Debug "PGCD de a et b = " + Str(c)
End
POurquoi vous venez tous casser ma baraque

Publié : mer. 24/mars/2004 21:34
par Pierre
j'ai pas regardé ton code (donc excuse moi si tu l'utilise) mais pour trouver un PGCD il faut utiliser l'algorithme d'Euclide je vais pas te dérouler une leçon mais je vais met un petit bout de code vite fait:
Code : Tout sélectionner
DefType.l
Dim Chiffres.l(2)
OpenConsole()
ConsoleTitle("Rechercheur de PGCD")
ClearConsole()
PrintN("Entrez deux nombre entier (mettez un espace entre les deux)")
PrintN("(mettez le plus grand chiffre en premier)")
Chiffre$ = Input()
For i = 1 To 2
Resultat$ = StringField(Chiffre$, i, " ")
Chiffres(i) = Val(Resultat$)
Next
Chiffre1 = Chiffres(1)
Chiffre2 = Chiffres(2)
Chiffredeb1 = Chiffres(1)
Chiffredeb2 = Chiffres(2)
Repeat
Reste = Chiffre1 % Chiffre2
If Reste = 0
Sortie = 1
Else
Chiffre1 = Chiffre2
Chiffre2 = Reste
EndIf
Until Sortie = 1
ClearConsole()
If Chiffre2 = 1
ClearConsole()
PrintN(Str(Chiffredeb1) + " et " + Str(Chiffredeb2) + " sont premiers entres eux")
Input()
End
EndIf
PrintN("Le PGCD de " + Str(Chiffredeb1) + " et de " + Str(Chiffredeb2) + " est " + Str(Chiffre2))
Input()
CloseConsole()
End
Publié : mer. 24/mars/2004 22:06
par Heis Spiter
Joli Oliv !
Pierre et toute sa science.... Je sais que c'est l'algorithme d'Euclide (puisque division Euclidienne)
dividende = diviseur * quotient + reste

T'es content Pierre ?
Publié : jeu. 25/mars/2004 18:54
par Dr. Dri
...
Publié : jeu. 25/mars/2004 20:38
par Oliv
Quand les 2 sont identiques, mais il ne faut pas grand chose pour le modifier