[C] Array
Scrivere un programma C che memorizza in un
array tutti i numeri primi minori di 50 e
successivamente li stampa a video.
Questo è il testo.
Questo è come ho provato per risolverlo:
Probabilmente sono scemo io perchè il programma smette di funzionare subito dopo l'esecuzione
array tutti i numeri primi minori di 50 e
successivamente li stampa a video.
Questo è il testo.
Questo è come ho provato per risolverlo:
#include <stdio.h> void primi (void); int array[50]; int j=1; int main (void){ array[0]=1; primi(); for (int i=0; i<=j; i++){ printf ("%d ", array[i]); } } void primi (void){ int d=3; while (d<50){ for (int i=2, e=0; i<d; i++){ if (d%i!=0){ e++; } if (e!=0){ array[j]=d; j++; } d++; } } }
Probabilmente sono scemo io perchè il programma smette di funzionare subito dopo l'esecuzione

Risposte
Ciao!
Ho letto il programma, e ho apportato alcune modifiche per farlo funzionare.
Io ti sconsiglio di usare variabili globali. Aumentano la complessità del programma.
Ho letto il programma, e ho apportato alcune modifiche per farlo funzionare.
Io ti sconsiglio di usare variabili globali. Aumentano la complessità del programma.
#include <stdio.h> void primi (int *, int *, int); int main (void) { int array[50]; int j; j=0; array[0]=2; primi(array, &j, 50); int i; printf("Elenco dei mumeri primi inferiori a 50:\n"); for (i=0; i<=j; i++){ printf ("%d \n", array[i]); } return 0; } // ridefinisco la funzione: // vettore: un riferimento all'array // j: riferimento all'indice dell'ultimo numero trovato // fine: dimensione massima del vettore void primi (int *vettore, int *j, int fine) { int d=3, i, e; // dichiaro variabili locali, anzichè globali. while (d<50) { e=0; for (i=2; i<d; i++) { if ((d % i) == 0) { // Solo se il resto è uguale a 0 // incremento e. e++; } } if (e == 0) { // Se e non è stata incrementata, allora d non ha divisori. (*j)++; // inceremento di uno l'indice del vettore if (*j >= fine) return; // se supero il limite dimensionale del vettore // termino la funzione. vettore[*j]=d; } d++; } }
Stavo provando a riscrivere il tuo programma ma ho fatto davvero fatica a leggerlo, alla fine ho deciso di riscriverlo.
Qualcuno ha gia' risposto prima che mandassi il messaggio ma a questo punto oramai mando anche la mia versione, e' altamente inefficiente ma ho cercato di essere il piu' semplice e chiaro possibile.
Gia' solo il crivello di Eratostene sarebbe significativamente piu' veloce.
#include <stdio.h> int is_primo(int n); //ritorna 1 se n e' primo, 0 altrimenti int main (void) { int primi[50]; int len = 0; for (int i = 2; i<50; i++) { //itera sui primi 50 interi if (is_primo(i)) { //se l'intero attuale e' primo primi[len] = i; //aggiungilo all'array len++; //e aumenta la variable che tiene il conto della lunghezza dell'array } } for (int i = 0; i<len; i++) { //stampa l'array printf("%d, ", primi[i]); } return 0; } int is_primo (int n) { //ritorna 1 se n e' primo, 0 altrimenti for (int d=2; d<n; d++) { //itera sui candidati divisori (in realta' e' superfluo arrivare fino a n) if ((n%d) == 0) { //se ne trova uno return 0; } } return 1; //se l'esecuzioni arriva fino a qui non sono stati trovati divisori, quindi ritorna 1 }
Qualcuno ha gia' risposto prima che mandassi il messaggio ma a questo punto oramai mando anche la mia versione, e' altamente inefficiente ma ho cercato di essere il piu' semplice e chiaro possibile.
Gia' solo il crivello di Eratostene sarebbe significativamente piu' veloce.
Grazie per le risposte, mi scuso per la scarsa leggibilità del pogramma, in futurò metterò dei commenti per renderlo più comprensibile.
Essendo agli inizi per me queste cose non sono proprio banali
Essendo agli inizi per me queste cose non sono proprio banali