Aiuto visualizzare N numeri primi

di Anonimizzato14525 il
10 risposte
Ciao a tutti,
sono nuovo nella programmazione e mi servirebbe un aiuto, non voglio che mi scriviate tutto l'algoritmo al massimo mi aiutate a impostare le parti più difficili ammesso che ci siano...
Dovrei fare un programma in C++ che permette di visualizzare N numeri primi, ad esempio se leggo un valore uguale a 10 mi dovrebbe visualizzare i primi 10 numeri primi (2, 3, 5, 7, 11, 13, 17, 19, 23. 29) Il mio problema è che non riesco a capire come risolvere il mio problema. Quindi se qualcuno mi potrebbe dare una logica da seguire, una spiegazione o qualsiasi altro aiuto che mi possa aiutare lo ringrazio con tutto il cuore...

Edit: in pratica vorrei più una mano teorica che pratica...

10 Risposte

  • Potresti iniziare con lo scrivere una funzione che ti restituisce 1 se il valore passato come argomento è un numero primo, 0 altrimenti.
  • Ok avevo già precedentemente sviluppato una funzione che calcolava se il numero fosse primo o no, ho solo dovuto applicare qualche modifica...
    
    int verificaprimo (int numero)
        {
        int resto ,primo;
        primo=1;
        for (int i=2; i<numero; i++)
        {
            resto=(numero%p);
            if (resto==0)
            {
                       primo=0;
                       return 0;
                       break;
            }
        }
        if (primo==q)
           {
                        return 1;
           }
           
        }
    
    adesso dovrei fare qualcosa tipo:
    
    {
        
        int resto, i, primo, nprimi ;
        primo=1;
        nprimi=0;
    while (nprimi !=numero)
    {
        for ( i=2; i<numero; i++)
        {
            resto=(numero%i);
            if (resto==0)
            {
                       primo=0;
            }
        }
        if (primo==1)
           {
                        cout << i << endl;
           }
           nprimi++;
        }
    }
    
    Però così facendo se inserisco un numero primo, 11, mi stampa per 11 volte 11... se invece il numero non è primo si ferma
    EDIT: forse mi sono spiegato male mettendo tutti quegli 11...
    quando inserisco il valore, ad esempio 5 che è numero primo mi stampa a schermo tipo:
    
    5
    5
    5
    5
    5
  • @Sanmon: avevi scritto una funzione che ti dice se un numero è primo oppure no: perchè non la richiami? Le funzioni servono ad essere richiamate, non modificate!
    Quindi, dopo aver predisposto tale funzione potresti provare a scrivere un programma che ti dice quali sono i numeri primi nell'intervallo [1,100] (naturalmente la funzione che hai scritto non la devi modificare!!!)
  • @Sarajevo Grazie, purtroppo ho dimenticato di dire che non abbiamo ancora studiato gli array, quindi ho delle "restrizioni" da seguire, quindi non credo di poter usare il crivello di Eratostene. Comunque forse posso estrapolare qualcosa.

    @candaluar Non ho ben capito, io ho fatto due funzioni (esclusa quella modificata che ho postato nel messaggio precedente) che sono in grado di stabilire se un numero è primo o viceversa, ora ti posto le due funzioni così se mai mi dici quale potrebbe essere la migliore...

    Questa è quella di prima non modificata
    
    int verificaprimo (int numero)
        {
        int resto ,primo;
        primo=true;
        for (int i=2; i<numero; i++)
        {
            resto=(numero%p);
            if (resto==0)
            {
                       primo=false;
                       cout<< "il numero non e' primo"<<endl;
                       break;
            }
        }
        if (primo==true)
           {
                       cout<< "il numero e' primo"<<endl;
           }
           
        }
    
    Mentre questa è un'altra:
    
    int  isprimo (int numbaget)
    {
         int primo, x, y;
         primo=true;
         x=(numbaget/2);
         y = (numbaget/ 2);
         for( numbaget> y;y > 1; y--) 
              {
                        if(!(numbaget%y)) 
                            {
                                 primo = false;
                                 x++;
                            }
              }
          //stampa a schermo     
         if(primo=true ) 
              {
                      cout << "Il numero precedentemente inserito non e' primo!"<<endl;
              }
         else
              {
                      cout << "Il numero precedentemente inserito e' primo!"<< endl;
              }
         system("PAUSE");     
    
  • Allora, mi spiego meglio. Tu hai una funzione che ti dice se un numero è primo oppure no: questa funzione dovrebbe ricevere in input un valore e restituire in output 1 o 0. Decidi tu qual è la migliore (mi raccomando, fa che al suo interno non stampi niente a video).
    Supponiamo che la tua funzione si chiami IsPrime(); la tua funzione dovresti testarla in questo modo:
    int main()
    {
        int i;
        for( i=1;i<100;i++ )
        {
            if( IsPrime(i) )
               printf( "%d è primo\n", i );
        }
    }

    Così verifichi che la tua funzione si comporti correttamente (o almeno lo stia facendo con i primi 100 interi).
    Quando questo funzionerà, ti renderai conto che il problema di stampare i primi 10 (o i primi n) diventerà molto più facile da affrontare!
  • @candaluar
    Perfetto grazie adesso funziona, ho rimosso il ciclo "for" facendo però rimanere i=3; ho aggiunto un ciclo while che mi permette di riavviare la funzione più volte fino a quando una variabile "stop" non sarà uguale al numero inserito, ad ogni ciclo se i assume il valore di primo lo stampo a schermo, incremento la variabile "stop" di 1 e (fouori dal costrutto if) aumento i di 2, se invece i non assume un valore primo lo aumento solamente il valore di i di due.

    Posto il codice perché non credo di essermi spiegato correttamente
    
    int Nnumprimi (int numero)
    {
     	int i, stop;
    	i=3;
    	stop=0;
         while (stop < numero)
          {
             if (verificaprimoNnumeri(i))
             {
                cout << i << endl;
                stop++;
             }
             i+=2;
          } 
    	  
          system ("pause");
          return 0;
    }
    
  • Corretto.
    Tuttavia io cambierei il nome alla funzione verificaprimoNnumeri(): il nome dovrebbe farti capire cosa fa e così com'è è fuorviante, meglio sarebbe chiamarla IsPrime(), IsPrimeNumber(), IsNumeroPrimo(), IsPrimo(), VerificaPrimo()...
    Anche la funzione Nnumprimi() la rinominerei in qualcosa tipo StampaNPrimi() e il parametro magari lo chiamerei 'nprimi' perchè così chi usa la funzione non ha dubbi su cosa passarle...
  • @candaluar
    Non sei il primo a dirmi che uso nomi incorretti per le variabili e le funzioni, pensa che ai miei primi programmi parecchie variabili le chiamavo "coso" "contacoso" "abbassacoso" e alle funzioni davo nomi tipo "ABC" "VDE" tasti schiacciati a caso insomma, adesso aggiusto tutto e grazie ancora
  • Non preoccuparti; dare i nomi è la cosa più difficile!
Devi accedere o registrarti per scrivere nel forum
10 risposte