Conteggio dei numeri primi

di il
4 risposte

Conteggio dei numeri primi

Ciao a tutti, premetto che sono nuova sia nel forum, che nella programmazione .Ho scritto un programma che dovrebbe stampare a video i primi n numeri primi (n iserito dall'utente), il problema e' che stampa dei numeri che non sono primi (come il 9, il 15 e il 21) il ragionamento che ho fatto nella funzione chiamata è questo: divido un numero i (che nella funzione è a) per numeri che vanno da 1 ad a, e ne verifica il resto delle divisioni. Se il resto è minore o uguale a 2 (il minore l'ho messo apposta per includere anche l'1 come numero primo) allora incrementa "nonprimo" di 1 tutto le volte. Alla fine della funzione controlla il valore di "nonprimo". Grazie in anticipo a chi risponderà!
Questo e' il codice :

#include <iostream>
using namespace std;

int funzione (int a) {						//funzione iterativa che trova numeri primi
	
	int nonprimo=0;
	int cont;
	int resto;
	
	for (cont=1;cont<=a;cont++) {
		resto=a%cont;
		if (resto==0) {
			nonprimo=nonprimo+1;
		}
	
        }
        	if(nonprimo<=2) {
			return a;
		}
}
int main () {                           //devo far inserire in input "n" e devo trovare i primi n numeri primi
	int n;
	int i;

	
	cout<<"Inserisci quanti n numeri primi vuoi conoscere\n"<<endl;
	cin>>n;
	for (i=1;i<=n;i++) {
		i=funzione(i);
		cout<<i<<"\n"<<endl;
	}
}

4 Risposte

  • Re: Conteggio dei numeri primi

    Iniziamo con la DEFINIZIONE di numero PRIMO:

    un numero e' primo se e' DIVISIBILE per se stesso e per l'unita'.

    Quindi se e' divisibile per QUALUNQUE altro numero MINORE di lui, allora NON E' primo. Ne basta UNO per dire che non e' primo !!!

    ALTRA questione se si vuole FATTORIZZARE il numeri, nel qual caso bisogna tenere traccia dei numeri che lo dividono

    ALTRA questione ancora e' CONTARE i sui divisori, nel qual caso il TUO ragionamento andrebbe QUASI bene se non fosse per un errore concettuale che hai scritto

    ZERO (o trucco ZERESIMO) : NON SI CONSIDERA MAI il numero 1. Tutta la teoria dei numeri NON CONSIDERA MAI il numero 1, perche' incasinerebbe la teoria senza portare a NESSUN beneficio. Poiche TUTTI i numeri sono divisibili per 1, TUTTI i numeri sarebbero NON PRIMI. Il che non ha senso, ovviamente .

    PRIMO trucco: se e' pari (divisibile per 2) allora NON E' PRIMO.
    Questo potrebbe essere fatto in modo molto efficiente senza nemmeno fare la divisione, cosi come ci sono trucchetti che ti permettono di testare in modo efficiente se il numero e' divisibile per 3, 5, ecc. Ma questa e' un'altra storia

    SECONDO trucco: siccome TUTTE i numeri pari sono multipli di 2, una volta che hai testato per 2 NON SERVE testare la divisibilita' per i numeri pari ma SOLO per i numeri dispari, quindi 3, 5, 7, ...

    TERZO trucco: invece di testarlo per TUTTI i numeri DISPARI da 3 a n-1, si puo' fare un po' di meglio.

    Supponi che il numero sia composto da due numeri piu' piccoli: n = a*b

    Ora uno sara' piccolo, diciamo 'a', ed uno sara' grande, diciamo 'b' ('b > a' ma potrebbe essere anche il contrario, va bene lo stesso)

    Se 'a' aumenta, puo' aumentare anche 'b'? OVVIAMENTE no, visto che il prodotto deve rimanete costante. Quindi, se trovi un 'a' piu' grande, NECCESSARIAMENTE 'b' dovra' essere piu' piccolo.

    Dove e' il punto di equilibrio? Quando i due numeri sono uguali (sempre se esistono). Allora avremo n = a*b = a*a = b*b = a^2

    QUNDI questo suggerisce che NON SERVE testare n per TUTTI i numeri piu' piccoli di lui, ma SOLO per tutti i numeri piu' piccoli della sua RADICE QUADRATA, perche' se esiste un numero piu' grande della radice quadrata che divide 'n' allora l'ALTRO numero DEVE ESSERE NECESSARIAMENTE piu' piccolo della radice quadrata,e quindi lo troveresti PRIMA di quello piu' grande

    QUARTO: troppo facile usare la libreria per calcolare la radice quadrata di numeri con la virgola , IMPLEMENTA la funzione per calcolare la radice quadrata usando SOLO gli interi. E' MOOLTO semplice, tanto quanto sapere se un numero e' primo (anzi, anche piu' semplice)

    https://en.wikipedia.org/wiki/Integer_square_roo

    QUINTO: esistono gia' tabelle dei primi MILIONI di numeri primi. Invece di generare da te i numeri primi, potresti usare una tabellina gia' pronta contenente, ad esempio, i primi, 100

    SESTO: per numeri MOOOLTO grandi, questo sistema NON FUNZIONA (ci vorrebbero ore, giorni, mesi o anni, o peggio, millenni, per testarne la primalita'). Esistono dei TEST DI PRIMALITA' piu' efficienti ma meno precisi.



    Ma questo solo per darti un'idea che i test di primalita sono un mondo decisamente strano e affascinate.


    QUESTO PER DIRE che il tuo ragionamento fa acqua un po' da tutte le parti


    CONSIDERAZIONE: EVITA COME LA PESTE di dover inserire ogni volta a mano il numero da testare, ALMENO fino a che il programma non funziona. Rallenta inutilmente le prove. Invece scrivi il numero DIRETTAMENTE dentro il codice, e testa se funziona
    Quando il codice funziona, puoi reintrodurre la prate di codice che chiede all'utente il numero da testare.

    >>>>>>

    Ed addesso vediamo il PASTICCIO del TUO CODICE: e' un pasticcio! Non vale la pena nemmeno tentare di correggerlo.

    Riscrivilo da 0 nel seguente modo:

    1) imposta 'n' a 100 (giusto per iniziare)
    2) scandisci i numeri da 2 a 100
    3) per OGNI numero controlli SE E' primo: quindi ti serve una FUNZIONE che data un numero intero dice se e' primo (ritorna 1) oppure no (ritorna 0)
    4) se il numero e' primo (la funzione ha ritornato 1) STAMPI il numero

    NON TOCCHI PER NESSUN MOTIVO l'indice del ciclo for che usi per scandire i numeri.
    QUINDI, a parte nel ciclo for, TU NON GLI CAMBI IL VALORE come invece fai nel tuo codice

    E come dire ad un amico: "dammi un numero",
    Lui te lo da e tu gli tiri un ceffone.
    Poverino, ma che ti ha fatto
  • Re: Conteggio dei numeri primi

    @migliorabile

    Una definizione di numero primo che non richiede alcuna "rettifica" per il numero 1, è la seguente:
    un numero primo è un numero intero positivo che abbia esattamente due divisori distinti.

    La RADICE QUADRATA non è indispensabile per capire quando fermarsi nella ricerca degli eventuali divisori.

    Da quanto ho capito @z3rgamonamour vuole calcolare i primi n numeri primi e non i numeri primi minori di n (in tal caso le suggerirei di cercare su wikipedia il crivello di Eratostene).
  • Re: Conteggio dei numeri primi

    @migliorabile
    Grazie per la tua risposta, ma sono alle prime armi, cercherò sicuramente di ottimizzarlo,ma come ha scritto @Nippolo l'intento era quello di stampare n numeri primi, n inserito da tastiera, la cosa che mi rodeva era capire il perché mi stampasse numeri non primi.

    Grazie a entrambi
  • Re: Conteggio dei numeri primi

    Di niente!

    Cmq va detto che anche il codice che hai postato va più nella direzione dei numeri primi minori di n, piuttosto che dei primi n numeri primi!
Devi accedere o registrarti per scrivere nel forum
4 risposte