[C] Visualizzare i numeri primi compresi tra 1 e 1000

Pubblicità

jolly

Utente Attivo
Messaggi
110
Reazioni
4
Punteggio
38
Salve a tutti,sto da un paio di giorni con questo esercizio ma non riesco a venirne fuori,forse ho qualche difficoltà a capire i for annidati,correggetemi se sbaglio in questo caso es:
Codice:
for (x=1;x<=10;x++) {
		
		for (i=1;i<=5;i++) {
		
			printf( "%d\n" ,i);
		}
		
		printf("\n");
}
Praticamente se ho capito bene,il programma esegue prima tutto quello che c'è nel ciclo for i,cioè scrive 1,2,3,4,5,dopo esce dal ciclo e va ad incrementare il ciclo for dove x diventa 2,quindi ritorna a contare fino a 5 e cosi via...in pratica dovrebbe contare fino a 5 per 10 volte giusto?

Ritornando all'esercizio l'ho svolto in questo modo ma mi trova solo 2 e 3 come numeri prima come mai:
Codice:
#include <stdio.h>

void main ()
{
	int x,i;
	
	for (x=2;x<=1000;x++) {
		
		for (i=2;i<=x/2;i++) {
		
			if (x%i == 0) {

				return;
			}
		
		}
		
		printf( "%d\n",x );
	}

}
 
Non ho capito bene lo scopo tu devi trovare dei numeri primi ?

Cmnq mettiamo caso che sia la prima volta che entri nel ciclo, ovvero con X = 2, il secondo ciclo for non partirà perchè dici di andare da 2 a X/2 cioè 1, e quindi stampa 2. Nel caso di X = 3 X / 2 darà 1 ancora saltando di nuovo il ciclo e stampando i valori 2 e 3.
Negli altri casi invece dovresti usare il BREAK, perchè il return ti fa uscire dal main() terminando il programma e non procedendo oltre.
Ad occhio e croce dovrebbe essere questo l'errore, inoltre quel printf non và nel primo ciclo for ma nel secondo in modo che stampi il numero DOPO che abbia controllato se è primo, non ogni volta che esce dal secondo ciclo for altrimenti li stampi sempre tutti ! :vv:.
Ultima cosa, tu controlli solo se quel numero ha un divisore e se cel'ha esci dal ciclo, non credo sia questo il modo giusto ! Dovresti dire che è primo se la tua "i" del secondo ciclo for ha superato (X / 2) + 1 ovvero nella sua metà non c'erano multipli esatti !
Spero di essere stato chiaro per quanto riguarda la spiegazione, se non hai capito chiedi pure di nuovo :)

---------- Post added at 15:56 ---------- Previous post was at 15:23 ----------

Soluzione:
Codice:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
    int x = 0;
    
    for (x = 2; x <= 1000; x++) 
    {

        if (IsPrimo(x) == 1) printf("%d\n",x);


    }

  system("PAUSE");    
  return 0;
  
}

//Controlla se un numero è primo ^^
int IsPrimo(int x)
{
     
     int i = 0;
     
     //Qui vedi se ha un multiplo esatto se cel'ha esci dalla funzione perchè non è primo
     for(i = 2; i <= x / 2; i++)
     {
     
           if (x % i == 0) return 0;
     
     }  

     //Se arrivi qui è più che primo ! ^^
     return 1;
     
}
 
Ultima modifica:
grazie anche per la soluzione,non ti offendere però ci vorrei arrivare da solo,ho provato in quest'altra maniera:
Codice:
#include <stdio.h>

void main ()
{
	int x,i;
	
	for (x=1;x<=100;x++) {
		
		for (i=2;i<x;i++) {
		
			if (x%i == 0) {

				return;
			}
		
		}
		
		printf( "%d\n", x );
	}

}

Lo sento sono vicinissimo,però mi manca qualche pezzo,in questo modo mi stampa solo 1,2,3...e ho capito il perchè in pratica x=1 e x=2, il ciclo non viene proprio verificato poichè i è minore di x,poi quando x diventa 3,lui esegue l'if e poichè il resto non è uguale a zero,stampa printf x,quindi 3,ma ora si verifica il problema perchè da come ho capito quando lui calcola x=4 poichè 4 % 2 == 0 quel return mi fa uscire dal programma.
Cosa posso usare al posto di return,in modo che se x%i== 0 deve solo saltare l'istruzione dell'if e andare avanti?

Perchè se al posto del return metto ad esempio printf("NO") mi restituisce questo,ho messo 100 numeri per convenienza:
Codice:
1
2
3
NO4
5
NONO6
7
NONO8
NO9
NONO10
11
NONONONO12
13
NONO14
NONO15
NONONO16
17
NONONONO18
19
NONONONO20
NONO21
NONO22
23
NONONONONONO24
NO25
NONO26
NONO27
NONONONO28
29
NONONONONONO30
31
NONONONO32
NONO33
NONO34
NONO35
NONONONONONONO36
37
NONO38
NONO39
NONONONONONO40
41
NONONONONONO42
43
NONONONO44
NONONONO45
NONO46
47
NONONONONONONONO48
NO49
NONONONO50
NONO51
NONONONO52
53
NONONONONONO54
NONO55
NONONONONONO56
NONO57
NONO58
59
NONONONONONONONONONO60
61
NONO62
NONONONO63
NONONONONO64
NONO65
NONONONONONO66
67
NONONONO68
NONO69
NONONONONONO70
71
NONONONONONONONONONO72
73
NONO74
NONONONO75
NONONONO76
NONO77
NONONONONONO78
79
NONONONONONONONO80
NONONO81
NONO82
83
NONONONONONONONONONO84
NONO85
NONO86
NONO87
NONONONONONO88
89
NONONONONONONONONONO90
NONO91
NONONONO92
NONO93
NONO94
NONO95
NONONONONONONONONONO96
97
NONONONO98
NONONONO99
NONONONONONONO100
Se ci fate caso i numeri scritti senza il no sono tutti numeri primi quindi il ragionamento presumo che sia in parte giusto ;)
 
Cosa posso usare al posto di return,in modo che se x%i== 0 deve solo saltare l'istruzione dell'if e andare avanti?

Come ho scritto nel post precedente break fa al caso tuo, inoltre per "ottimizzare" puoi fare andare il secondo ciclo for fino a <= X/2 perchè non ci sarà sicuramente un multiplo maggiore della sua metà.

Ora, tu fai stampare SEMPRE il numero, che sia primo o meno, perchè metti la richiesta di stampa nel primo ciclo for. Il tuo ragionamento è giusto, ma a metà ! Perchè devi stampare SOLO se è primo, quindi se non trovi nessuna I che vada da 2 a X/2 che dia X%I == 0.

Per cui nel ciclo for da I a X/2 devi controllare per quale motivo sei uscito dal ciclo se per il break e quindi non è primo, oppure perchè I è arrivata ad X/2 + 1 quindi è primo e allora stampi !

Codice:
Per farti capire, non è la soluzione

#include <stdio.h>

void main ()
{

    int x,i;
    
    for (x=1;x<=100;x++) {
        
        //Non hai bisogno di arrivare fino ad X, <= X/2 basta e avanza
        for (i=2;i<=x/2;i++) {
        
            if (x%i == 0) {

                //Usa il break per interrompere i cicli !
                break;
            }
        
        }

      //Qui ti chiederai se è primo o non è primo SE E' PRIMO allora comunicherai a video altrimenti niente
        
    }

}

Spero di essere stato ancora più chiaro :)
 
Ho fatto come mi hai consigliato tu:
Codice:
#include <stdio.h>

void main ()
{
	int x,i;
	
	for (x=1;x<=100;x++) {
		
		for (i=2;i<=x/2;i++) {
		
			if (x%i == 0) {

				break;
			}
		
		}
		
		if (x%i != 0) {
			printf( "%d\n", x );
		}
	}

}
E ora funziona bene :) grazie mille Devrak

ops mi sono reso conto che non scrive il 2 !

ho risolto aggiungendo un altro if ecco il codice finito:
Codice:
#include <stdio.h>

void main ()
{
	int x,i;
	
	for (x=1;x<=1000;x++) {
		
		for (i=2;i<=x/2;i++) {
		
			if (x%i == 0) {

				break;
			}
		
		}
				
		if (x==2) {
			printf("%d\n" ,x);
		}		

		if (x%i != 0) {
			printf( "%d\n", x );
		}
	}

}
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top