Stampa dei numeri primi

di il
22 risposte

Stampa dei numeri primi

#include <stdio.h>
#include <stdlib.h>



int main()
{
    int n,i;


   do {
    printf("\nInserire un numero intero che non superi il valore di 200\n\n\t");
    scanf("%d",&n);
    printf("\n");
    }  while(n>200);
 for (i=0;i<=n;i++)
 {

   if( ((i%2)!=0)&&((i%3)!=0)&&((i%5)!=0)&&(i!=1))
   printf("->%d ",i);
 }
printf("\nMa naturalmente, non dimentichiamoci dei primi : 2 3 5 ");




 return 0;
}
Il problema è questo: non riesco a stampare il 2,3, 5.
Nel senso se li metto nel printf del ciclo for me li ripete ad ogni numero.
Trovare una proprietà che me li distingua dal resto sarebbe una buona cosa penso ma non so che fare.
Prego chiunque di aiutarmi.

22 Risposte

  • Re: Stampa dei numeri primi

    Ciao, in realtà questo algoritmo non va bene perchè ad esempio ti direbbe che 49 è primo mentre ovviamente non lo è...

  • Re: Stampa dei numeri primi

    Esatto, in pratica stampa tutti i numeri che non sono multipli di 2, 3 o 5 ma questa non è la caratteristica che hanno i numeri primi.Devi proprio creare un nuovo algoritmo!
  • Re: Stampa dei numeri primi

    http://it.wikipedia.org/wiki/Crivello_di_Eratosten
  • Re: Stampa dei numeri primi

    Si puo' fare di meglio!

    Un numero N e' primo se non e' divisibile per 2 o per un numero dispari <= della radice quadrata di N.

    (e questo perche'?)

    Altro trucco interessante: come calcolare la radice quadrata (INTERA, NON un il numero reale) di un intero SENZA convertirlo in un numero relae (float o double che si voglia, e quindi usare le funzioni matematiche della libreria standard del linguaggio)?
  • Re: Stampa dei numeri primi

    Il comando della radice come si fa ?
  • Re: Stampa dei numeri primi

    La funzione che calcola la radice è sqrt, con signature:
    double sqrt( double num );
    Ricorda di includere <math.h>.
  • Re: Stampa dei numeri primi

    Ho problemi però col ciclo for e mettere la condizione che mi avete detto, non riesco a scrivere la sintassi correttamente potete scrivermela per favore ?
  • Re: Stampa dei numeri primi

    Della ha scritto:


    La funzione che calcola la radice è sqrt, con signature:
    double sqrt( double num );
    Ricorda di includere <math.h>.
    Ma questa usa la libreria matematica (che era esclusa dal'ipotesi).

    L'idea e' calcolare la radice quadrata intera .

    C'e' la versione efficiente (ma serve un po' di studio)
    ma anche la versione banale. Ed e' proprio banale!

    Basta la definizione di radice quadrata!

    Ovviamente, essendo una radice intera, e' ovvio che, ad esempio,

    isqrt(5) -> 2

    (isqr che sta per integer square root, e' una funzione che non esiste)

    perche' 2*2 = 4 ma 3*3 = 9.

    (e qui ho praticamente detto come calcolarla )
  • Re: Stampa dei numeri primi

    Sicuramente è una via, ma prendere la parte intera di quanto restituito da sqrt funzionerebbe allo stesso modo
  • Re: Stampa dei numeri primi

    Della ha scritto:


    Sicuramente è una via, ma prendere la parte intera di quanto restituito da sqrt funzionerebbe allo stesso modo
    Non necessariamente (beata gioventu' ):

    se la radice quadrata e' calcolata via software, la versione solo intera e' mooooolto piu' efficiente.

    Tranquillo, esistono CPU che non hanno i calcoli in floating point!
    Vuoi un esempio? Le calcolatrici!

    Gia', quelle che si usano in classe (se si usano ancora ).
  • Re: Stampa dei numeri primi

    Ehm chiedo scusa, ma davvero non riesco a farlo. Il programma che uso (Codeblock) mi dà errore del tipo int float che non corrispondono. Tra l'altro non so come scrivere il numero dispari nel programma.
    Di regola un numero dispari è tale se 2*n+1, tuttavia non so come renderlo in questo programma.
  • Re: Stampa dei numeri primi


    dinoinfo ha scritto:


    Ehm chiedo scusa, ma davvero non riesco a farlo. Il programma che uso (Codeblock) mi dà errore del tipo int float che non corrispondono. Tra l'altro non so come scrivere il numero dispari nel programma.
    Di regola un numero dispari è tale se 2*n+1, tuttavia non so come renderlo in questo programma.
    Lo rendi come lo hai reso prima, calcolando il resto da una divisione intera per 2.

    dinoinfo ha scritto:


    
    
       if( ((i%2)!=0)&&((i%3)!=0)&&((i%5)!=0)&&(i!=1))
    
    Per l'errore (che credo sia un "cannot convert ...") posta il codice e la riga dove te lo dice.
  • Re: Stampa dei numeri primi

    int main()
    {
       int n,i,k,m;
    
    
       do {
        printf("\nInserire un numero intero che non superi il valore di 200\n\n\t");
        scanf("%d",&n);
        printf("\n");
        }  while(n>200);
    
    
     for (i=2;i<=n;i++)
     {
         ((i%2)!=0)==m;
        k=sqrtl(i);
        m<=k;
    
       if (i%2!=0&&i%m!=0)
    
        printf("-> %d ",i);
     }
    
    
    
    
    
     return 0;
    }
    

    Questo dovrebbe funzionare eppure non va... sono disperato!
  • Re: Stampa dei numeri primi

    dinoinfo ha scritto:


    
         ((i%2)!=0)==m;
    
    Scusa, che cosa è questo? A cosa serve?

    dinoinfo ha scritto:


    
        m<=k;
    
    E questo?

    Comunque la tua idea di base, era buona, forse lunga, ma buona:

    dinoinfo ha scritto:


    
     for (i=0;i<=n;i++)
     {
    
       if( ((i%2)!=0)&&((i%3)!=0)&&((i%5)!=0)&&(i!=1))
       printf("->%d ",i);
     }
    printf("\nMa naturalmente, non dimentichiamoci dei primi : 2 3 5 ");
    Basta che aggiungi un (&& (i%7) != 0) e sei a posto .
    Se vuoi stampare anche i numeri 2, 3, 5, 7, basta che metti un'altra condizione tipo:
    if(i/2 == 1) oppure direttamente if(i == 2).
Devi accedere o registrarti per scrivere nel forum
22 risposte