Grazie per la risposta.
hai ragione meglio fare un po di chiarezza.
allora parto dal fatto che in un programma che posto qui sotto il mio scopo e' molteplice.
il primo e' quello di trovare i numeri primi in un intervallo da 2 ad n con n inserito da tastiera.
una volta trovati i numeri primi il codice permette di trovare i fattori di n che nel caso sia primo sono solo 2
il codice inoltre calcola le differenze tra due numeri primi successivi.
il codice ad un certo punto chiede di inserire un ulteriore parametro che rappresenta l intervallo aperto tra due primi e quindi impostando questo parametro posso stampare ad esempio la successione dei primi gemelli o altre successioni di primi con diversi intervalli aperti di separazione.
nel nuovo codice che sto implementando vorrei avere la possibilita' di ricercare i numeri primi tra 2 ed n per diversi valori di n in pratica e' come ripetere la ricerca n volte ed ottenere n diversi output.
PS mi sapresti suggerire una strada piu' semplice per implementare Eratostene?
ecco il codice iniziale
#include <stdio.h>
#include <math.h>
#define N 5000
int insert(int *v) {
int i, n, a;
printf("controlliamo se n e' >= 2 e in tal caso procediamo\n");
printf("2 e' l unico numero primo pari, per controllare se n e' primo basta vedere se nella colonna dei numeri primi generati\n");
printf("l ultimo numero coincide con n, se coincide il numero e' primo altrimenti non lo e'\n");
printf("controlliamo se n e' pari o dispari\n");
printf("troviamo i numeri primi <= di n con il Crivello di Eratostene\n");
printf("attenzione se inserisci un numero con il punto o con la virgola il codice\n");
printf("va in loop e per fermarlo occorre premere ctrl+c e ricompilarlo per ripartire\n\n\n\n");
while (n<2) {
printf("il numero n deve essere >=2; inserisci n--- ");
scanf("%d", &n);
}
a = sqrt (n);
if(n==a*a)
printf("il numero %d e' un quadrato perfetto\n",n);
if (n%2 == 0)
printf("il numero e' positivo e pari\n");
else
printf("il numero e' positivo e dispari\n");
printf("\n");
/*generiamo un vettore di zeri*/
for(i=2; i<=n; i++)
v[i]=0;
return n;
}
void eratostene(int *v, int n) {
int i,j;
for(i=2; i<=n; i++)
// if(v[i]==0)
for(j=2*i; j<=n; j+=i)
v[j]=1; //let's set v[j]=1, to mark all the multiple number ; that's the sieve
}
void print(int *v, int n) {
int i,k;
k=0;
for(i=2; i<=n; i++)
if(v[i]==0) //if the number is prime
k=k+1; //count the number of prime numbers
printf("\nnumeri primi compresi tra 2 e %d sono %d:\n\n",n,k);
for(i=2; i<=n; i++)
printf("%d\t",v[i]);
}
void primo (int *v, int *q,int n) {//memorizzo i primi nel vettore q[i] ma contiene anche gli zeri
int i,j;
for(i=2; i<=n; i++)
if(v[i]==0)
q[i]=i; //vettore che contiene i numeri primi e gli zeri come distanze
}
void terzo (int *q,int *z,int n) { //creo un nuovo vettore di primi senza gli zeri
int i,j,M,flag;
M=0; //dimensione nuovo vettore
for(i=2; i<=n; i++)
if(q[i]!=0) {
flag=0;
for(j=0;j<=M ;j++)
if(z[j]==q[i])
flag=1;
if(flag==0)
z[M]=q[i];
M=M+1;
}//chisura ciclo if
printf("numeri primi memorizzati in un vettore\n"); //ho eliminato gli zeri da q nel vettore z
for(i=0; i<M; i++)
printf("%d\t",z[i]);
}
void quarto (int *z,int *w) { //trovo il vettore delle differenze tra due numeri primi successivi
int i,j,M;
printf("\n\n");
printf("vettore differenze tra due primi successivi\n");
for(i=0; i<M; i++) {
w[i]=z[i+1]-z[i]; }
// printf("\nvettore delle distanze ossia intervalli aperti tra due primi successivi\n");
for(i=0; i<M-1; i++) {
printf("%d\t",w[i]); }
}
void quinto (int *z,int *f,int n) { //funzione che memorizza i fattori di n inclusi gli zeri in un vettore f
int i,j,M,flag;
printf("\n");
printf("stampiamo i fattori primi di %d\n",n);
for(i=0; i<M; i++) {
if(n%z[i]==0)
f[i]=z[i];
}
}
void sesto (int *z,int *f,int *g,int n) {
int i,j,L,M,flag,k;
L=0; //dimensione nuovo vettore
for(i=0; i<n; i++)
if(f[i]!=0) {
flag=0;
for(j=0;j<=L ;j++)
if(g[j]==f[i])
flag=1;
if(flag==0)
g[L]=f[i];
L=L+1; //L e' la dimensione del vettore che contiene i fattori di n senza gli zeri
}//chisura ciclo if
// printf("\nfattori primi memorizzati in un vettore\n"); //ho eliminato gli zeri da f
for(i=0; i<L; i++) {
printf("%d\n",g[i]);}
}
void ottavo (int *g,int n) { //funzione che stampa gli esponenti dei fattori primi
int i,k,tmp,t;
printf("esponenti dei fattori primi\n");
for(i=0;i<t;i++){
k=0;
tmp=g[i];
while(n%tmp==0){
n=n/tmp;
k=k+1; }
printf ("%d\n",k);//stampa degli esponenti
}
}
void dieci (int *s,int *f,int *g,int n) { //funzione che ricostruisce n a partire dai fattori e dagli esponenti dei fattori
int i,j,k,t,tmp,L,flag;
printf("\n%d = ",n);
L=0;
for(i=0; i<n; i++)
if(f[i]!=0) {
flag=0;
for(j=0;j<=L ;j++)
if(g[j]==f[i])
flag=1;
if(flag==0)
g[L]=f[i];
L=L+1; } //ricostruisco la dimensione di L per i fattori
for(i=0;i<L;i++){
k=0;
tmp=g[i];
while(n%tmp==0){
n=n/tmp;
k=k+1;
s[i]=k; // memorizzo gli esponenti nel vettore s
}
}
for(i=0;i<L;i++)
printf ("%d^%d ",g[i],s[i]);//stampa del numero n con fattori ed esponenti
printf("\n");
}
void nove (int *q,int *z,int *g,int *w,int n,int r) {
int i,j,M,flag;
M=0; //devo ricostruire la dimensione del vettore perche' M e' variabile locale
for(i=2; i<=n; i++)
if(q[i]!=0) {
flag=0;
for(j=0;j<=M ;j++)
if(z[j]==q[i])
flag=1;
if(flag==0)
z[M]=q[i];
M=M+1; }
printf("\n\n");
while(r<1) {
printf("il parametro r deve essere >=1;se r=2 (vuol dire r-1 interi nel sub-intervallo r) otteniamo la lista dei numeri primi gemelli\n");
printf("se tutte le coppie di numeri primi <=%d hanno distanza inferiore ad r\n",n);
printf("il codice non genera nessuna coppia e termina\n");
printf("inserisci qui il parametro r--- ");
scanf("%d", &r); }
for(i=0;i<M;i++) {
if(w[i]==r)
printf("%d\t%d\n",z[i],z[i+1]); }
}
int main() {
int a[N],b[N],c[N],d[N],e[N],x[N],y[N],u[N],n,r; //a=v; b=q, c=z; d=w; e=f; g=x; h=y;s=u
n=insert(a);
eratostene(a,n);
print(a,n);
primo(a,b,n);
terzo(b,c,n);
quarto(c,d);
quinto(c,e,n);
sesto(c,e,x,n);
ottavo(x,n);
nove(b,c,x,d,n,r);
dieci(u,e,x,n);
return 0; }