Primzahlen - Sieb des Eratosthenes



  • Hallo Leute,
    ich bin blutiger C-Anfänger und momentan fast am verzweifeln. Wir sollen mithilfe des Siebes von Eratosthenes Primzahlen bis zu einer einzugebenden Obergrenze ausgeben. Ich programmiere in Ubuntu und benutze den gcc-Compiler.
    Hier mein Code:

    #include<math.h>
    #include<stdio.h>
    
    int funkt(int u, int *m) {
    
    	int y[2*u];
    	/*int w=floor(sqrt(u));
    	printf("dddddddddd%d",w);*/
    	int i, l;
    	for(i=0; i<u-1; i++) {
    	y[i] = 0;
    	}
    	// Werte setzen
    	for(i=0; i<u-1; i++) {
    	y[i] = i+2;
    	}
    
    	/*i=0;
    	while(i<10){
    	printf("%.2d \n", y[i]);
    	i++;
    	}*/
    
    	int x[(int)(u*0.5)];
    	for(i=0; i<(int)(u*0.5); i++) {
    	x[i] = i+1;
    	}
    
    	int  a, k;
    	i=2;
    	while(i <= (int)(u*0.5)){
    		int j=0;
    		while(j<(u-1)){ //(int)(sizeof(x)/sizeof(x[0]))
    		if(i % (y[j])==0){
    		k=0;
    			while(k<=(int)(u*0.5)){ //floor(sqrt(u))-1
    				y[j+i+i*k]=0;
    				k++;
    				}
    		}
    		j++;
    		}
    	i++;
    	}
    
    	/*i=0;
    	while(i<10){
    	printf("%.2d \n", y[i]);
    	i++;
    	}*/
    
    int g=0;
    l=0;
    while(l<u) {
    if(y[l]!=0) {
      m[g]=y[l];
      g++;
    }
      l++;
    }
    
    }
    
    int main() {
    int u;
    printf("Eingabe u: ");
    scanf("%d", &u);
    int m[u], i;
    funkt(u,m);
    i=0;
    while(i<u){
    printf("%d \n", m[i]);
    i++;
    }
    }
    

    Ich weiß, ästhetisch ist das nicht allererste Sahne.
    Das Problem ist, dass der Compiler immer als Fehler immer Gleitkomma-Ausnahme angibt.
    Ich hab echt keine Ahnung woran's liegt und bin für jede Hilfe sehr dankbar.

    Schönen Abend zusammen, ich hau mich auf's Ohr!

    Patrick



  • patrick4 schrieb:

    Ich weiß, ästhetisch ist das nicht allererste Sahne.

    Das wird schon mal das Problem mit der Hilfe sein.

    Du musst unbedingt an deinem Einrückungsstil arbeiten. Man hat keinen Überblick, was wie wo zusammen gehört.

    Warum hast du überhaupt Fließkommazahlen drin (int)(i * 0.5) schreibt man doch besser als i/2

    Wozu die ganzen anderen Arrays (y,x)?

    Du darfst ruhig die beiden Felder m[0] und m[1] nicht nutzen und diese für 0 und 1 nehemn. Das macht das Ganz einfacher.

    Und nimm aussagekräftige Variablennamen. Das ist kein Basic V2 vom Commodore64 sondern C.

    Und wenn du den C-Tag statt Code nimmst, wird es sogar farbig und bunt.



  • danke für die Hilfe. Jetzt klappt's. An meiner Einrückung arbeite ich noch. 😉

    #include<math.h>
    #include<stdio.h>
    
    int funkt(int u, int *m) {
    
    	int y[2*u];
    	int i, l;
    	for(i=0; i<u; i++) {
    	y[i] = i;
    	}
    
    	int  a, k;
    	i=2;
    	while(i <(int)(u/2)){ 
    		int j=i;
    		while(j<u){ 
    		if((y[j]) % i==0){
    		k=0;
    			while(k<(int)(u/i)){ 
    				y[j+i+i*k]=0;
    				k++;
    				}
    		 break;
    				} else {
    				j++;
    		}
    		}
    	i++;
    	}
    
    i=0;
    while(i<u){
      if(y[i]!=0){
    printf("%d \n", y[i]);
      }
    i++;
    }
    
    int g=0;
    i=0;
    while(i<u) {
    if(y[i]!=0) {
      m[g]=y[i];
      g++;
    }
      i++;
    }
    
    }
    
    int main() {
    int u;
    printf("Eingabe u: ");
    scanf("%d", &u);
    int m[2*u], i;
    for(i=0; i<=2*u; i++) {
    	m[i] = 0;
    	}
    funkt(u,m);
    
    /*i=0;
    while(i<u){
      if(m[i]!=0){
    printf("%d \n", m[i]);
      }
    i++;
    }*/
    
    }
    


  • Hab's mal von der IDE einrücken lassen.

    #include<math.h>
    #include<stdio.h>
    
    int funkt(int u, int* m) {
    	int y[2*u];
    	int i, l;
    	for(i=0; i<u; i++) {
    		y[i] = i;
    	}
    
    	int  a, k;
    	i=2;
    	while(i <(int)(u/2)) {
    		int j=i;
    		while(j<u) {
    			if((y[j]) % i==0) {
    				k=0;
    				while(k<(int)(u/i)) {
    					y[j+i+i*k]=0;
    					k++;
    				}
    				break;
    			}
    			else {
    				j++;
    			}
    		}
    		i++;
    	}
    
    	i=0;
    	while(i<u) {
    		if(y[i]!=0) {
    			printf("%d \n", y[i]);
    		}
    		i++;
    	}
    
    	int g=0;
    	i=0;
    	while(i<u) {
    		if(y[i]!=0) {
    			m[g]=y[i];
    			g++;
    		}
    		i++;
    	}
    }
    
    int main() {
    	int u;
    	printf("Eingabe u: ");
    	scanf("%d", &u);
    	int m[2*u], i;
    	for(i=0; i<=2*u; i++) {
    		m[i] = 0;
    	}
    	funkt(u,m);
    
    	/*i=0;
    	while(i<u){
    	  if(m[i]!=0){
    	printf("%d \n", m[i]);
    	  }
    	i++;
    	}*/
    }
    

Anmelden zum Antworten