Esercizio C, numeri primi

di il
3 risposte

Esercizio C, numeri primi

Ciao a tutti. Da poco, pochissimo, sono a contatto con il linguaggio C.
Mentre svolgevo alcuni esercizi mi sono imbattuto in una difficoltà.
L'esercizio è il seguente: realizzare in linguaggio C la funzione corrispondente alla dichiarazione extern unsigned int prossimo_numero_primo(unsigned int x); che deve ritornare il più piccolo numero primo maggiore di x (ad es. 7). L'approccio all'esercizio non prevede l'utilizzo di printf() e scanf().
La funzione primo() veniva richiesta in un esercizio precedente e restituisce 1 se val è primo, 0 altrimenti.

Questo è quanto ho scritto:
int primo(unsigned int val) {

	unsigned int i, m = 0;
	for (i = 2; i <= (val / 2); ++i) {
		if (val%i == 0) {
			m = 1;
			break;
		}
	}
	if (m == 0)
		return 1;
	else return 0;
}


unsigned int prossimo_numero_primo(unsigned int x) {

	int z;
	if (primo(x + 1) == 1)
		return x + 1;
	else
	for (z = 1; primo(x + z) == 0; z++)
		x += z;

	return x;

}

unsigned int main(void) {
	unsigned int x = 7;
	unsigned int risultato = prossimo_numero_primo(x);
	return risultato;
}
Ciò però non produce l'output desiderato. I miei dubbi sono principalmente due:
1) La funzione primo() è effettivamente corretta? Provando alcuni valori pare di sì, ma è matematicamente giusta?
2) Il ciclo for di prossimo_numero_primo() dopo la prima iterazione procede di due in due saltando ovviamente dei possibili valori candidati, perché?

Scusate se ci sono errori anche banali, ma sono davvero i miei primi passi verso la programmazione.

3 Risposte

  • Re: Esercizio C, numeri primi

    Ti ricordo che i pari non sono primi ...
  • Re: Esercizio C, numeri primi

    1) La funzione primo() è effettivamente corretta? Provando alcuni valori pare di sì, ma è matematicamente giusta?
    Scrivi un programmino di prova che cicla tutti i valori fino ad un massimo, es.1000, richiama la tua funzione e ti stampa tutti i primi; verifica poi il risultato che ottieni.
    Un consiglio: potresti prima testare se è divisibile per 2 poi eventualmente partire con un nuovo ciclo dal divisore 3 e a step di 2 (3,5,7...)
    2) Il ciclo for di prossimo_numero_primo() dopo la prima iterazione procede di due in due saltando ovviamente dei possibili valori candidati, perché?
    Ma questa funzione non l'hai scritta tu??? Se non è farina del tuo sacco, prova a riscriverla, è più semplice di quanto pensi!!!
  • Re: Esercizio C, numeri primi

    candaluar ha scritto:


    2) Il ciclo for di prossimo_numero_primo() dopo la prima iterazione procede di due in due saltando ovviamente dei possibili valori candidati, perché?
    Ma questa funzione non l'hai scritta tu??? Se non è farina del tuo sacco, prova a riscriverla, è più semplice di quanto pensi!!!
    Non penso di avere ancore le skills adatte per poter copiare/incollare codice e capirci qualcosa

    Ho provato a riscrivere la funzione prossimo_numero_primo() utilizzando un while:
    unsigned int prossimo_numero_primo(unsigned int x) {
    
    	int i = 1;
    	while (primo(x + i) == 0)
    		i += 1;
    	if (primo(x + i) == 1)
    		return x + i;
    	else
    		return 0;
    }
    Così a quanto pare funziona, ma non ho ancora capitò perché la versione con il for non funziona...
Devi accedere o registrarti per scrivere nel forum
3 risposte