Page 1 sur 2

Savoir par quel nombre est divisible un nombre

Publié : sam. 29/nov./2014 10:47
par Lord Nelson
Coucou, j'ai créer ceci, savez-vous si ya moyen de faire plus optimisé ? :)

Code : Tout sélectionner

Procedure.s NombreDivisablePar(Nombre.Q, DiviseurMinimum.Q, DiviseurMaximum.Q)
  
  Resultat$ = ""
  
  If Nombre.Q > 0
    
    For Diviseur = DiviseurMinimum.Q To DiviseurMaximum.Q
      
      Nombre$ = StrD(Nombre.Q / Diviseur, 20)
      Decimale$ = Mid(Nombre$, FindString(Nombre$, "."))
      
      If Mid(Nombre$, 1, 1) <> "0" And ValD(Decimale$) = 0
        
        Resultat$ + Str(Diviseur) + ", "
        
      EndIf
      
    Next
    
    If Right(Resultat$, 2) = ", "
      Resultat$ = Mid(Resultat$, 1, Len(Resultat$) - 2)
    EndIf
    
    If Resultat$ > ""
      ProcedureReturn Resultat$
    Else
      ProcedureReturn "Rien"
    EndIf
    
  Else
    
    ProcedureReturn "0"
  EndIf
  
EndProcedure

For Nombre.Q = 0 To 1000
  Debug Str(Nombre.Q) + " est divisable par: " + NombreDivisablePar(Nombre.Q, 2, 999)
Next

Re: Savoir par quel nombre est divisible un nombre

Publié : sam. 29/nov./2014 11:08
par Azur
Hello, est-ce que ceci conviendrait ?

Code : Tout sélectionner

EnableExplicit

Procedure findRound(n,min,max)
  Define i
  For i=min To max
    If n>i
      Define decimal.f=n/i
      Define entier.i=n/i
      If decimal=entier
        Debug Str(n)+" est divisable par "+Str(i)
      EndIf
    EndIf
  Next
EndProcedure

Define i

For i=1 To 1000
  findround(i,2,999)
Next 

Re: Savoir par quel nombre est divisible un nombre

Publié : sam. 29/nov./2014 14:56
par Lord Nelson
Merci beaucoup Asur :)

J'ai reformater à ma sauce pour mieux m'y repérer mais le résultat reste inchangé, je suis plutôt très très maniaque quand je code :)

Code : Tout sélectionner

Procedure.s FindRound(Nombre.Q, DiviseurMinimum.Q, DiviseurMaximum.Q)
  
  Protected Diviseur.Q = 0
  Protected Decimal.F = 0
  Protected Entier.I = 0
  Protected Resultat$ = ""
  
  For Diviseur.Q = DiviseurMinimum.Q To DiviseurMaximum.Q
    
    If Nombre.Q > Diviseur.Q
      
      Decimal.F = Nombre.Q / Diviseur.Q
      Entier.I = Nombre.Q / Diviseur.Q
      
      If Decimal.F = Entier.I
        Resultat$ + Str(Diviseur.Q) + ", "
      EndIf
      
    EndIf
    
  Next
  
  If Not Resultat$ > ""
    
    Resultat$ = "lui-même"
    ProcedureReturn Resultat$
    
  Else
    ProcedureReturn Mid(Resultat$, 1, Len(Resultat$) - 2)
    
  EndIf
  
EndProcedure

For Nombre = 1 To 1000
  Debug Str(Nombre) + " est divisable par " + FindRound(Nombre, 2, 999)
Next 

Re: Savoir par quel nombre est divisible un nombre

Publié : sam. 29/nov./2014 18:37
par Azur
Oui mais je t'en prie fais toi plaisir.
J'ai un doute avec ton code.
Premier truc, moi j'ai la version 32bits ( sur un OS 64 ) et je me fais jeter au moment de

Code : Tout sélectionner

For Diviseur.Q = DiviseurMinimum.Q To DiviseurMaximum.Q
Il me dit : boucle for n'accepte pas un Quad ( parait logique sur un compilo en 32bits ) bref.
Je sais pas pourquoi tu types en quad systématiquement à mon avis c'est une mauvaise habitude dans ce cas précis.
Je comprend pas la ligne

Code : Tout sélectionner

If Not Resultat$ > ""
Oui sinon on est d'accord, j'ai remplacé la variable résultat par une variable flag, ça me donne ça.

Code : Tout sélectionner

EnableExplicit

Procedure findRound(n,min,max)
  Define i
  Define flag=0
  For i=min To max
    If n>i
      Define decimal.f=n/i
      Define entier.i=n/i
      
      If decimal=entier
        Debug Str(n)+" est divisible par "+Str(i)
        flag=1
      EndIf
    EndIf
  Next
  
  If flag=0
    Debug Str(n)+" Divisible par lui même uniquement=> nombre premier"
  EndIf
  
EndProcedure

Define i

For i=1 To 999
  findround(i,2,999)
Next 
Bon visiblement tu as besoin de bosser en chaines de caractères, admettons c'est plus gourmand en mémoire mais tu dois avoir une bonne raison.
++

Re: Savoir par quel nombre est divisible un nombre

Publié : sam. 29/nov./2014 21:07
par Lord Nelson
Coucou,

Oui, mauvaise habitude possible, je fais ça pour accepter le plus grand nombre possible voila tout :)
If Not Resultat$ > ""
Bha si le nombre n'est pas divisable, il renvoie une chaîne vide donc je fais comme ceci :)
Bon visiblement tu as besoin de bosser en chaines de caractères, admettons c'est plus gourmand en mémoire mais tu dois avoir une bonne raison.
P't’être bien qu'oui, P't’être qu'non :)
Merci à toi :)

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 12:48
par Micoute
Bonjour Lord Nelson, voici ma solution.

Code : Tout sélectionner

Procedure.s NombreDivisiblePar(Nombre.Q, DiviseurMinimum.Q, DiviseurMaximum.Q)
  
  Resultat$ = ""
  
  If Nombre
    
    For Diviseur = DiviseurMinimum To DiviseurMaximum
      
      Nombre$ = StrD(Nombre / Diviseur, 20)
      Decimale$ = Mid(Nombre$, FindString(Nombre$, "."))
      
      If Mid(Nombre$, 1, 1) <> "0" And ValD(Decimale$) = 0
        
        Resultat$ + Str(Diviseur) + ", "
        
      EndIf
      
    Next
  
    If Right(Resultat$, 2) = ", "
      Resultat$ = Mid(Resultat$, 1, Len(Resultat$) - 2)
    EndIf
    
    If Resultat$ > ""
      ProcedureReturn Resultat$
    Else
      ProcedureReturn "lui-même"
    EndIf
    
  Else
    
    ProcedureReturn "rien du tout !"
  EndIf
  
EndProcedure

For Nombre = 0 To 255
   Debug Str(Nombre) + " est divisible par: " + NombreDivisiblePar(Nombre, 2, Nombre-1)
Next

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 16:00
par falsam
Une petite lecture sur ce lien : http://www.purebasic.com/french/documen ... ables.html

Et le code qui va avec qui te donneras le même résultat en nettement plus rapide et plus court.

Code : Tout sélectionner

Procedure.s NombreDivisablePar(Nombre.Q, DiviseurMinimum.Q, DiviseurMaximum.Q)
  Protected Resultat$
  
  If Nombre > 0
    For Diviseur = DiviseurMinimum To DiviseurMaximum
      If Nombre % Diviseur = 0
        Resultat$ + Str(Diviseur) + ", "
      EndIf
    Next
        
    If Resultat$ = ""
      Resultat$ = "Rien, "
    EndIf    
  EndIf
  
  ProcedureReturn Left(Resultat$, Len(Resultat$) - 2)
EndProcedure

For Nombre = 0 To 1000
  Debug Str(Nombre) + " est divisable par: " + NombreDivisablePar(Nombre, 2, 999)
Next

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 16:31
par Lord Nelson
Merci à tous :)

Petite rectification mineur:

Code : Tout sélectionner

Procedure.s NombreDivisablePar(Nombre.Q, DiviseurMinimum.Q, DiviseurMaximum.Q)
  Protected Resultat$
 
  If Nombre > 0
    
    For Diviseur = DiviseurMinimum To DiviseurMaximum
      
      If Nombre % Diviseur = 0
        Resultat$ + Str(Diviseur) + ", "
      EndIf

    Next
       
    If Resultat$ = ""
      Resultat$ = "Rien, "
    EndIf
    
  Else
    Resultat$ = "Rien, "
    
  EndIf
 
  ProcedureReturn Left(Resultat$, Len(Resultat$) - 2)
EndProcedure

For Nombre = 0 To 1000
  Debug Str(Nombre) + " est divisable par: " + NombreDivisablePar(Nombre, 2, 999)
Next

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 16:44
par falsam
Mon dieu un If de plus !!!! tout ça pour "rien" :mrgreen:

Code : Tout sélectionner

Procedure.s NombreDivisablePar(Nombre.Q, DiviseurMinimum.Q, DiviseurMaximum.Q)
  Protected Resultat$ = "Rien, "
  
  If Nombre > 0
    For Diviseur = DiviseurMinimum To DiviseurMaximum
      If Nombre % Diviseur = 0
        Resultat$ + Str(Diviseur) + ", "
      EndIf
    Next        
  EndIf
  
  ProcedureReturn Left(Resultat$, Len(Resultat$) - 2)
EndProcedure

For Nombre = 0 To 1000
  Debug Str(Nombre) + " est divisable par: " + NombreDivisablePar(Nombre, 2, 999)
Next

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 17:37
par Lord Nelson
Mon dieu un If de plus !!!! tout ça pour "rien" :mrgreen:
Non mais là par contre ont est pas d’accord lol.

Tu met au début que le nombre est divisable par "Rien" et en plus tu dis que le If est pour Rien.
Un nombre est divisable par "Rien" si il est divisable par aucun nombre et pas "Rien" dès le début :mrgreen:

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 18:20
par falsam
Tu n'as même pas testé ce dernier code !!! Le résultat est le même que ton code banane. Et je persiste l'ajout de ton "if" ne sert à rien sauf à ralentir le temps d'éxécution.

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 18:27
par Lord Nelson
Banane toi même :lol:
Bien sur que si j'ai testé :)
0 est divisable par: Rien
1 est divisable par: Rien
2 est divisable par: Rien, 2
3 est divisable par: Rien, 3
4 est divisable par: Rien, 2, 4
5 est divisable par: Rien, 5
6 est divisable par: Rien, 2, 3, 6
7 est divisable par: Rien, 7

.../...

995 est divisable par: Rien, 5, 199, 995
996 est divisable par: Rien, 2, 3, 4, 6, 12, 83, 166, 249, 332, 498, 996
997 est divisable par: Rien, 997
998 est divisable par: Rien, 2, 499, 998
999 est divisable par: Rien, 3, 9, 27, 37, 111, 333, 999
1000 est divisable par: Rien, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500
Edit par TazNormand
J'ai raccourci ta liste, ça prend de la place inutilement sur le serveur du forum, et comme tu es un adepte de la compression :lol:

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 18:32
par falsam
Suite de ma réponse sur ce lien

PS : Et ne fanfaronne pas hein ? ou je viens te booter le cul !

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 18:53
par Lord Nelson
Hé bhé pourquoi tans de violence :mrgreen:

Re: Savoir par quel nombre est divisible un nombre

Publié : dim. 30/nov./2014 20:15
par Ollivier
Lord Nelson a écrit :Banane toi même :lol:
Bien sur que si j'ai testé :)
0 est divisable par: Rien
1 est divisable par: Rien
2 est divisable par: Rien, 2
3 est divisable par: Rien, 3
4 est divisable par: Rien, 2, 4
5 est divisable par: Rien, 5
6 est divisable par: Rien, 2, 3, 6
7 est divisable par: Rien, 7

.../...

995 est divisable par: Rien, 5, 199, 995
996 est divisable par: Rien, 2, 3, 4, 6, 12, 83, 166, 249, 332, 498, 996
997 est divisable par: Rien, 997
998 est divisable par: Rien, 2, 499, 998
999 est divisable par: Rien, 3, 9, 27, 37, 111, 333, 999
1000 est divisable par: Rien, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500
Edit par TazNormand
J'ai raccourci ta liste, ça prend de la place inutilement sur le serveur du forum, et comme tu es un adepte de la compression :lol:
Merci. Ton geste calme ma macula.