Savoir par quel nombre est divisible un nombre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Savoir par quel nombre est divisible un nombre

Message 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
Azur
Messages : 40
Inscription : ven. 22/mai/2009 23:58

Re: Savoir par quel nombre est divisible un nombre

Message 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 
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Savoir par quel nombre est divisible un nombre

Message 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 
Azur
Messages : 40
Inscription : ven. 22/mai/2009 23:58

Re: Savoir par quel nombre est divisible un nombre

Message 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.
++
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Savoir par quel nombre est divisible un nombre

Message 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 :)
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Savoir par quel nombre est divisible un nombre

Message 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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Savoir par quel nombre est divisible un nombre

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Savoir par quel nombre est divisible un nombre

Message 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
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Savoir par quel nombre est divisible un nombre

Message 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
Dernière modification par falsam le dim. 30/nov./2014 18:18, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Savoir par quel nombre est divisible un nombre

Message 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:
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Savoir par quel nombre est divisible un nombre

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Savoir par quel nombre est divisible un nombre

Message 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:
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Savoir par quel nombre est divisible un nombre

Message par falsam »

Suite de ma réponse sur ce lien

PS : Et ne fanfaronne pas hein ? ou je viens te booter le cul !
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Savoir par quel nombre est divisible un nombre

Message par Lord Nelson »

Hé bhé pourquoi tans de violence :mrgreen:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Savoir par quel nombre est divisible un nombre

Message 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.
Répondre