PGCD

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

PGCD

Message 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
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message 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
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Me dis pas que j'ai fait tout ca pour rien :cry: :2gunfire: :shocked!: ... Bon c'est pas grave :jesors:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

J'arrive pô à trouver... Faut dire que la recherche IPB... Ca cherche pas grand chose... Bon ok j'arrete :roll:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message 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:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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:
Pierre
Messages : 244
Inscription : ven. 23/janv./2004 20:29
Localisation : 77 (Région parisienne)

Message 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 
Image
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message 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 ?
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le lun. 10/oct./2005 8:48, modifié 1 fois.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Quand les 2 sont identiques, mais il ne faut pas grand chose pour le modifier
Répondre