Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227

    [C]Stampa numeri primi in un array

    Come da titolo, sto facendo un programma che inserito un array, mi deve stampare i numeri primi di questo array.. peccato che non stampi nulla... Eccolo (salto l'inserimento dei numeri e la stampa del vettore... metto solo i nomi delle variabili e il punto incriminato):

    codice:
       int i, v[i], n, cont, a;
    ...................................................
    
    printf("\nSono stati inseriti i seguenti numeri primi: ");
      
       for(i=0;i<n;i++){
                        cont=0;
                        for(a=2;a<v[i];a++){
                                            if(v[i]%a!=0){
                                            cont+=1;}
                                            
                        if(cont==v[i])
                         printf("%3d", v[i]);}
     }
     printf("\n");
      system("pause");
    }
    che sbaglio??? il test di primalità?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    L'idea potrebbe anche andare bene, ma non è sviluppata altrettanto bene.

    Supponiamo che l'elemento i-esimo del vettore abbia valore 13 (che è primo)

    tu dividi 13 per tutti i numeri da 2 a "v[i] - 1" (in questo caso 12), e ogni volta che il resto della divisione intera è diverso da 0, incrementi un contatore. La tua speranza è che, se il numero è primo, tale contatore assuma un valore uguale a quello dell'elemento i-esimo? Non è così... nel caso del tredici avresti infatti:

    13 % 2 != 0 -> count = 1;
    13 % 3 != 0 -> count = 2;
    13 % 4 != 0 -> count = 3;
    ...
    continua così, alla fine ottieni:
    ...
    13 % 12 != 0 -> count = 11;

    cioè 13 è primo, ma col tuo metodo count alla fine avrà valore 11, che non è certamente uguale a 13... quello che vuoi fare tu andrebbe bene se tu dividessi 13 per tutti i numeri compresi tra 1 e 13 (compresi gli estremi!) ma poiché la divisione intera per 1 e 13, in questo caso, produrrebbe 0 come resto, non andrebbe bene comunque.

    Io ti consiglio innanzitutto di "modularizzare" il problema, cioè sviluppare una funzione che, per ogni valore dell'array, restituisce "vero" se questo è primo e "falso" altrimenti. Nel caso sia primo, lo stampi.

    Come sviluppare la funzione? Pensaci un po' sopra... tra l'altro potresti ache evitare di calcolare il modulo proprio con tutti i numeri compresi tra 2 e v[i] - 1...

    pensaci: ciascun numero è divisibile esattamente (al massimo) per la sua metà... cioè, il massimo divisore esatto di 12 (tolto sé stesso) è 6, quello di 14 è 7 e così via...
    every day above ground is a good one

  3. #3
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    mmm... le funzioni purtroppo non le so fare, quindi mi tocca continuare con questo metodo...
    magari potrei arrivare col secondo for a v[i]/2... ma se è dispari mi salta un valore perchè troncherebbe la parte decimale... quindi magari potrei fare nel secondo if

    codice:
     if(cont==(v[i]-2))
    proprio perchè elimino gli estremi... ma così 2 non dovrebbe essere considerato primo...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da abbax
    mmm... le funzioni purtroppo non le so fare, quindi mi tocca continuare con questo metodo...
    In genere è tra le prime cose che si imparano, ma comunque si può fare anche senza ( by the way, quando scrivi "int main()" stai definendo una funzione )

    Comunque la struttura del controllo dovrebbe essere più o meno questa:

    v[i] è 2 o 3? Bene, allora è primo, quindi stampalo;

    v[i] è divisibile per 2? Bene, allora qualsiasi sia il suo valore, di sicuro non è primo (perché è divisibile almeno per 2!) quindi non lo stampare;

    per j che va da 3 a v[i]/2 (con incremento di 2), verifica che v[i] non sia divisibile per j. Se non è divisibile per nessun valore di j, allora è primo, quindi stampalo.

    Perché ho detto "con incremento di 2" ? Perché se siamo giunti a questo ciclo iterativo, abbiamo già constatato col secondo controllo che v[i] NON è divisibile per 2, cioè è dispari... e allora nel ciclo iterativo possiamo evitare di calcolare il modulo di v[i] con i multipli di 2, perché tanto il numero è dispari quindi siamo sicuri che per ogni j pari risulterà v[i] & j != 0.

    Prova a scrivere un po' di codice ora.
    every day above ground is a good one

  5. #5
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    Ottimo... ora sembra che giri
    codice:
    for(i=0;i<n;i++){
                        if(v[i]==2||v[i]==3)
                        printf("%3d",v[i]);
                        else{
                        cont=0;
                        for(a=3;a<(v[i]/2);a+=2){
                                            if(v[i]%a==0){
                                            cont+=1;}
                                            
                        if(cont==0)
                         printf("%3d", (v[i]));}
     }
    }
    ti ringrazio soprattutto per il fato che mi hai fornito il procedimento e me l'hai spiegato molto bene... potresti fare quasi il prof

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se vuoi guardati un po' anche questo codice scritto al momento... non l'ho ricontrollato molto ma di sicuro funziona. In particolare nota quell'istruzione "break" all'interno del secondo che interrompe l'esecuzione del ciclo "forzatamente", cioè anche se non è stato raggiunto il predicato di uscita. Chiediti infatti cosa succede se v[i] valesse (ad esempio) 100000005: questo numero è sicuramente NON primo, e il fatto che non lo sia lo sappiamo già per a = 5... quindi, perché continuare inutilmente con il ciclo?

    codice:
    #include <stdio.h>
    
    int main(void) {
    
            int array[10], j;
            short i, v_boolean;
    
            printf("Immettere 10 numeri interi positivi:\n");
    
            for ( i = 0; i < 10; i++ ) {
    
               printf("array[%d]: ", i);
               scanf("%d", array + i);
            }
    
            printf("I numeri primi immessi sono i seguenti:\n");
    
            for ( i = 0; i < 10; i++ ) {
    
               if ( array[i] <= 1 )
    
                  continue; /* la successione dei numeri primi inizia da 2 */
    
               if ( array[i] == 2 || array[i] == 3 )
    
                  printf("array[%d]: %d\n", i, array[i]);
    
               else if ( array[i] % 2 ) {
    
                       v_boolean = 1;
    
                       for ( j = 3; j <= (int) array[i] / 2; j += 2)
    
                          if ( ! ( array[i] % j ) ) {
    
                             v_boolean = 0;
                             break;
                             /* se sono nel corpo di questo if, v[i] è sicuramente
                                divisibile almeno per j, quindi non è primo... e quindi
                                interrompo il ciclo senza continuarlo inutilmente       */
                          }
    
                       if ( v_boolean )
    
                          printf("array[%d]: %d\n", i, array[i]);
               }
            }
    
            return 0;
    }
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.