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 :D 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... :D

Publié : mer. 24/mars/2004 21:05
par Oliv
On accuse windows à tord et à travers #grrr
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
Me dis pas que j'ai fait tout ca pour rien :cry: :2gunfire: :shocked!: ... Bon c'est pas grave :jesors:

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 :roll:

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 :roll:

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 :lol:

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
:jesors:

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