Stampa dei numeri primi

di Anonimizzato12308 il
22 risposte
#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

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

  • 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!
  • 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)?
  • Il comando della radice come si fa ?
  • La funzione che calcola la radice è sqrt, con signature:
    double sqrt( double num );
    Ricorda di includere <math.h>.
  • 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 ?
  • 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 )
  • Sicuramente è una via, ma prendere la parte intera di quanto restituito da sqrt funzionerebbe allo stesso modo
  • 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 ).
  • 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.

  • 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.
  • 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!
  • 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