Esercizio vettore numeri primi C

di il
26 risposte

26 Risposte - Pagina 2

  • Re: Esercizio vettore numeri primi C

    Non mi sembra che al termine di quella funzione l'array v contenga i primi 30 numeri primi, inoltre la variabile qPrimi risulta inutilizzata.
    Ragiona meglio sul fine che vuoi raggiungere e su quello che invece stai effettivamente facendo!
  • Re: Esercizio vettore numeri primi C

    Hai ragione, invece per quanto riguarda ciò che devo inserire nel main, devo fare in modo di fare riferimento alla funzione sul calcolo dei numeri semplicemente o sbaglio ?
  • Re: Esercizio vettore numeri primi C

    cls ha scritto:


    Hai ragione
    Quindi come andrebbe corretta la funzione?

    cls ha scritto:


    invece per quanto riguarda ciò che devo inserire nel main, devo fare in modo di fare riferimento alla funzione sul calcolo dei numeri semplicemente o sbaglio ?
    Non sono sicuro di aver capito bene la domanda, potresti essere più chiaro?
    In ogni caso il miglior modo di intendersi è attraverso il codice!
  • Re: Esercizio vettore numeri primi C

    La funzione sto cercando di correggerla vediamo cosa riesco a fare

    no niente lascia stare ho fatto una domanda inutile a cui mi sono risposto da solo
  • Re: Esercizio vettore numeri primi C

    Ho scritto in questo modo e il programma compila. Può andare bene ?
    
    #define N 120
    #include <stdio.h>
    int primo(int* v);
    
    
    int main() {
        int v[N+1];
        
        printf("Crivello\n");
        printf("%d\n", primo(v));
        
        return 0;
        
    }
    
    int primo(int* v) {
    
    unsigned int j;
    for(unsigned int i = 2; i <= N; ++i)
    {
        if(!v[i])
        {
            printf("%d\t", i);
            for(j = 2 * i; j <= N; j += i)
            {
                v[j] = 1;
            }
        }
    }
    printf("\n");
    return 0;
    }
    
  • Re: Esercizio vettore numeri primi C

    Ho scritto in questo modo e il programma compila. Può andare bene ?
    Andar bene per cosa?!

    Cosa ti aspetti che faccia quel programma? Hai provato a lanciarlo? L'output corrisponde alle tue aspettative?
  • Re: Esercizio vettore numeri primi C

    Si l'ho lanciato e mi stampa i primi 30 numeri primi (cioè da 2 fino a 113, inclusi).
  • Re: Esercizio vettore numeri primi C

    Allora sei più fortunato di me, perchè io lanciandolo ottengo il seguente output:



    Se a volte funziona e a volte no, presumo ci sia qualcosa che non vada nel codice!

    Un consiglio, tieni presente la traccia dell'esercizio e l'obiettivo che ti sei prefissato di raggiungere!
  • Re: Esercizio vettore numeri primi C

    Vedrò di sistemarlo, grazie comunque per la disponibilità !
  • Re: Esercizio vettore numeri primi C

    Visto che la consegna chiede di fare una funzione che trovi i primi tot numeri primi, non sarebbe sensata una cosa tipo questa?
    void genera_primi( int *v, unsigned int q ) {
        if( NULL != v ) {
            memset( v, 0, q*sizeof(*v) ); // azzera il contenuto del vettore
    
            if( 0 < q ) {
                unsigned int i, n;
    
                *v = 2; // per togliersi dai piedi d'un botto i numeri pari
    
                for( i=1, n=3; 0<q; n+=2 ) {
                    unsigned int j, divisibile = 0;
    
                    for( j=1; j<i && !divisibile; ++j )
                        divisibile = 0==n%v[j];
    
                    if( !divisibile && j==i ) {
                        v[i++] = n;
                        --q;
                    }
                }
            }
        }
    }
    L'idea è avere una funzione che riceva in ingresso l'indirizzo a un vettore di interi con spazio sufficiente per q elementi, vettore nel quale la funzione possa collocare i primi q valori della serie dei numeri primi (2, 3, 5, 7...).
  • Re: Esercizio vettore numeri primi C

    Visto che la consegna chiede di fare una funzione che trovi i primi tot numeri primi, non sarebbe sensata una cosa tipo questa?
    Certo!
    In pratica per stabilire se n è un numero primo, vai a controllare che esso non sia divisibile per i numeri primi minori di n.
    Mi sono permesso di apportare qualche piccola modifica, in particolare per diminuire il numero di papabili divisori per il generico n. Per esempio per stabilire che 113 sia primo non serve testare i numeri primi fino a 109, ma basta fermarsi a 7.
    void genera_primi(int *v, unsigned int q)
    {
        if(v && q)
        {
            memset(v, 0, q * sizeof(*v));
            unsigned int i = 1;
            v[0] = 2;
            for(unsigned int n = 3; i < q ; n += 2)
            {
                int primo = 1;
                for(unsigned int j = 1; v[j] && v[j] <= n / v[j]; ++j)
                {
                    if(n % v[j] == 0)
                    {
                        primo = 0;
                        break;
                    }
                }
                if(primo)
                {
                    v[i++] = n;
                }
            }
        }
    }
  • Re: Esercizio vettore numeri primi C

    Non mi era neanche passato per l'anticamera del cervello di pensare alle possibili ottimizzazioni, più che altro intendevo mostrare il senso della funzione che secondo me è richiesta dall'esercizio. Dunque non mi stupisco che tu abbia trovato delle migliorie, che hai fatto bene a farmi notare. Magari ne sono possibili anche altre...
Devi accedere o registrarti per scrivere nel forum
26 risposte