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 funzioneOriginariamente inviato da abbax
mmm... le funzioni purtroppo non le so fare, quindi mi tocca continuare con questo metodo...)
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.