Funzione per trovare numeri primi

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Attenzione però, te hai messo m == 2, nel programma precedente c'è m = 2, poi esegue semplicemente il modulo per vedere se il numero è pari.
    Oltretutto ci sono altri errori, come n%­m==2. Ti conviene forse far tornare una stringa, al posto di un booleano.. l'ho sistemato ma non te lo posto, voglio che lo sistemi te! ;)



    Edit: @lumo: come il programma di Riovandaino :asd:


    Edited by RootkitNeo - 8/11/2009, 14:33
     
    Top
    .
  2. x-reynik-x
     
    .

    User deleted


    Ho provato così ma non funziona non capisco il perché! Se gli metti un numero continua all'infinito a dire: n è primo, n è primo, n è primo....
    CODICE
    def prime(n):
           if n <= 3:
                   print(n, 'è un numero primo')
           m = 2
           while m <= (n*m):
                   if n % m == 0:
                           print(n, 'non è un numero primo')
                           m = m + 1,
                           break
                   print(n, 'è un numero primo')



    Ho provato con il codice di Rootkit Neo e l'ho adeguato a Python 3 e funziona, è perfetto!!!
     
    Top
    .
  3. x-reynik-x
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 7/11/2009, 22:12)
    Sono riuscito a combinare qualcosa

    CODICE
    def primo(n):
     if n%2==0 and n!=2:
       print "Il numero ",n," non e primo"
     elif n==2:
       print n," e primo"
     else:
       for i in range(3,(n+1)):
         if n%­i==0 and n!=i:
           print n," non e primo il suo primo divisore e ",i,""
           break
         elif n%­i==0:
           if n==i:
             print n,"e un numero primo"
             break
     
    numero = input('Inserisci il numero:')
     
    primo(numero)


    è molto simile alla tua, un pò riaggiustata. Se hai bisogno di chiarimenti chiedi, sono qui!! :)

    Non capisco queste parti:

    if n%2==0 and n!=2:
    if n%­i==0 and n!=i:

    != significa diverso e quindi se n è diverso da 2(nel primo caso) dovrebbe essere classificato come non primo! E lo stesso nel secondo caso.
     
    Top
    .
  4.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (x-reynik-x @ 9/11/2009, 16:52)
    Non capisco queste parti:

    if n%2==0 and n!=2:
    if n%­i==0 and n!=i:

    != significa diverso e quindi se n è diverso da 2(nel primo caso) dovrebbe essere classificato come non primo! E lo stesso nel secondo caso.

    Dunque, si leggerebbe "diverso da".
    Io nel primo caso dico: se n%2 è uguale a 0 (quindi se la divisione non ha resto), e n!= da 2, e il numero che metto non è 2 il numero non è primo. Esempio: n=4;

    if 4%2==0 and 4!=2:

    In poche parole verifico solamente che il numero sia un numero pari, ma che sia diverso da 2.

    Nel secondo caso invece, if n%­i==0 and n!=i:, dico: Se n%­i è uguale a 0 (se il resto della divisione è 0) e n!=i il numero non è primo. Questo perchè controllo i numeri dispari (in java avrei messo in modo diverso il ciclo), ovvero, se n=3 e i (che inizia da 3) è uguale ad n (l'uguaglianza si ha al primo ciclo in questo caso) da resto 0 (quindi è divisibile), e n è diverso da i, il numero non è pari. Effettuo il controllo sul diverso da i proprio per controllare che non sto avendo resto 0 solo perchè i numeri sono uguali.

    CODICE
    n=3;

    i al primo ciclo è 3:
    if n diviso i da resto 0, e n è diverso da i, il numero non è primo.


    Sotto se noti c'è un elif che controllo se da resto 0,m e appena sotto un if per vedere se sono uguali.
    Per finire: se n è uguale a 11 e i è uguale a 11 è ovvio mi dia resto 0, e se i numeri sono uguali è primo! ;)
     
    Top
    .
  5. x-reynik-x
     
    .

    User deleted


    Ahh grazie ora sì che ho capito! Grazie mille!
     
    Top
    .
  6.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (x-reynik-x @ 9/11/2009, 17:23)
    Ahh grazie ora sì che ho capito! Grazie mille!

    Figurati! ;)
     
    Top
    .
  7. TTDH
     
    .

    User deleted


    CODE
    def numero_primo(numero):
       numerod = ""
       for i in range(2, numero):
           if numero % i == 0:
               numerod += str(i) + " / "
       if  numerod != "":          return "%­s, divisibile per %­s"  % ("numero non primo", numerod)
       else:                              return "numero primo"
     
    Top
    .
  8. ~{Skydrake™}»
     
    .

    User deleted


    CITAZIONE (TTDH @ 9/11/2009, 18:33)
    CODICE
    def numero_primo(numero):
       numerod = ""
       for i in range(2, numero):
           if numero % i == 0:
               numerod += str(i) + " / "
       if  numerod != "":          return "%­s, divisibile per %­s"  % ("numero non primo", numerod)
       else:                              return "numero primo"

    Mi sembra che questo sia l'algoritmo più pesante in questo topic :P
    Come ho detto precedentemente, basta fare il ciclo da 2 a radice di N, e non da 2 a N :D
    Inoltre, se ti servono tutti i divisori, basta che (sempre nel ciclo da 2 a radice di N) controlli se il numero è divisibile per la variabile contatore. Se lo è, aggiungi ai divisori sia la variabile contatore, sia (N / variabile contatore) ;)
     
    Top
    .
  9.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Si esatto!! :D

    Bè comunque postando diverse soluzioni si hanno diversi ragionamenti diciamo, che siano più o meno contorti poco importa.. ma il bello è proprio il fatto che ci si può arrivare in diversi modi!! :D
    Io facendolo simile al suo ho fatto notare a lui qualcosa che non conosceva, che non gli era chiaro..
     
    Top
    .
  10. ~{Skydrake™}»
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 9/11/2009, 22:06)
    Si esatto!! :D

    Bè comunque postando diverse soluzioni si hanno diversi ragionamenti diciamo, che siano più o meno contorti poco importa.. ma il bello è proprio il fatto che ci si può arrivare in diversi modi!! :D
    Io facendolo simile al suo ho fatto notare a lui qualcosa che non conosceva, che non gli era chiaro..

    Certo, è a questo che serve questa sezione ;)
     
    Top
    .
  11.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CODICE
    def prime(n):
     if n <= 3:
       return "primo"
     m = 2
     while m <= (n*m):
       if n % m == 0:
         return "non primo"
       m = m+1
       return "primo"
     
    numero = input('Inserisci il numero: ')
    print prime(numero)


    Questa è la traduzione in Python di quella postata precedentemente da Skydrake
     
    Top
    .
  12. Pippo_94
     
    .

    User deleted


    Se hai interesse a sviluppare ulteriormente il tuo algoritmo per trovare i numeri primi, prova a dare un'occhiata a quanto viene riportato su Wikipedia.
     
    Top
    .
  13. x-reynik-x
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 10/11/2009, 14:17)
    CODICE
    def prime(n):
     if n <= 3:
       return "primo"
     m = 2
     while m <= (n*m):
       if n % m == 0:
         return "non primo"
       m = m+1
       return "primo"
     
    numero = input('Inserisci il numero: ')
    print prime(numero)


    Questa è la traduzione in Python di quella postata precedentemente da Skydrake

    Ma in questo modo dice che tutti i dispari sono primi! Provala fa così
     
    Top
    .
  14.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (x-reynik-x @ 10/11/2009, 16:38)
    Ma in questo modo dice che tutti i dispari sono primi! Provala fa così

    Si è vero.
    C'è un errore concettuale :P
    Trasforma quello che avevo fatto io in java in python ;)
     
    Top
    .
  15. ~{Skydrake™}»
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 10/11/2009, 17:48)
    CITAZIONE (x-reynik-x @ 10/11/2009, 16:38)
    Ma in questo modo dice che tutti i dispari sono primi! Provala fa così

    Si è vero.
    C'è un errore concettuale :P
    Trasforma quello che avevo fatto io in java in python ;)

    Azz, non è un errore concettuale. E' che non viene visualizzato il carattere backslash (ovvero l'operatore di divisione intera).
    CODICE
    def prime(n):
    if n <= 3:
      return "primo"
    m = 2
    while m <= (n(backslash)m):
      if n % m == 0:
        return "non primo"
      m = m+1
      return "primo"

    numero = input('Inserisci il numero: ')
    print prime(numero)
     
    Top
    .
44 replies since 3/11/2009, 17:13   3096 views
  Share  
.