All pastes #490359 Raw Edit

Something

public text v1 · immutable
·published 2007-05-15 23:41 UTC
rendered paste body


int n=0;
int *natZahlen;		//deklaration und initialisation des arrays

void setBit(int j) {		//setzt das b'te bit im array -> 1
	int feld = j/32;
	int shift = 1 << j%32;
	if ((natZahlen[feld] & shift) == 0){
		natZahlen[feld] = natZahlen[feld] | shift;
	}
}
	
int getBit( int b ){	//prueft ob das b'te bit 1 ist -> true -> keine primzahl
	return natZahlen[b/32] & (1 << (b%32));
}
	
void prim(){
	int p = 2;				//start mit der ersten primzahl 2
	while ((p*p)<=n){			//waehrend das maximum der zu entfernenden zahlen (p^2) unter n ist
		int j;
		for (j=2*p; j<=n; j+=p){ //setze mehrfache von p 1 (also die nicht prim)
			setBit(j);
		}
		do { //waehrend aktive primzahl nicht n erreicht und p primzahl ist
			p++;				//erhoehe p um einz
		} while (p<=n && getBit(p));
	}
}
	
int min(int a, int b){
	return a<b? a: b;
}
	
void ausgabe(){
		int prims = 0;
		int arrayrun;
		for (arrayrun = 2; arrayrun <= n ; arrayrun ++){
			if ( getBit(arrayrun) == 0 ){ 	//!GetBit(arrayrun)
				prims = prims+1;
			}
		}
		printf("Insgesamt befinden sich %d Primzahlen in dem angegebenen Intervall\n", prims);	
		int outp = 0;
		for (arrayrun = 2; arrayrun <= n ; arrayrun ++){
			if ( getBit(arrayrun) == 0 ){ 	//!GetBit(arrayrun)
				outp++;
				printf("%d ",arrayrun);
				if (outp >=50){
					break;
				}
			}
		}
		printf("\n");
		printf("Das waren die ersten %d Primzahlen des Intervalls.\n", min(50,prims));
		int last = min(prims-50, 5);
		if (last > 0){
			printf("Es folgen die letzten %d.\n", last);
			int prims2 = 0;
			int arr[last];
			for (arrayrun = n-1; arrayrun >= 0 ; arrayrun--){
				if ( getBit(arrayrun) == 0 ){ 	//!GetBit(arrayrun)
					arr[last-prims2-1] = arrayrun;
					prims2++;
					
					if (prims2 >= last){
						break;
					}
				}
			}
			
			int i;
			for (i=0;i<last;i++){
				printf("%d ",arr[i]);
			}
		}
		printf("\n");
}


int main() {
	//n = Integer.parseInt(args[0]);	//n den startparameter zuweisen
	n = 200000000;
	natZahlen = malloc (sizeof(int) * (int)((n+1)/32+1));
	int i;
	for (i=0;i<(int)((n+1)/32+1);i++){
		natZahlen[i] = 0;
	}
	prim();
	ausgabe();
	return 0;
}