// Encoding: UTF-8 /* * Soubor: prvocisla.c * Datum: 20.3.2007 * Autor: Martin Filo, xfilom00stud.fit.vutbr.cz * Projekt: IJC DU1 * Popis: Aplikace Eratosthenova sita. */ #include #include #include #include #include "error.h" //#define N 80000000L //cislo, do kteryho se bude pocitat prvocisla #define N 100 #define P (N >> 3) //delime cislem 8, aby se vyuzili vsechny bity #define POCET 10 //kolik se jich ma vypsat odzadu //Najde sekci #define SekceBPole(i) \ ((long)(i)/(CHAR_BIT*sizeof(long))) //Vymaskuje nastavi masku na bit. #define MaskaBPole(i) \ ((long)1 << ((long)(i) & (CHAR_BIT*sizeof(long)))) #define BitArray(pole,size) \ unsigned long pole[(size+1)] = {0} //Pokud nebylo definovano USE_INLINE, pouziji se makra. #ifndef USE_INLINE #define SetBit(pole,off,x) \ (void) ((off) >= N ? \ Error("SetBit: Index %ld je mimo rozsah 0..%ld\n", (long)(i), (long)(N)), 0\ : \ ((x) != 0 ? \ (pole[SekceBPole(i)] |= (MaskaBPole(i))) : \ (pole[SekceBPole(i)] &= ~(MaskaBPole(i))))) #define GetBit(pole, off) \ ((off) >= N ? \ Error("SetBit: Index %ld je mimo rozsah 0..%ld\n", (long)(i), (long)(N)), 0\ : \ (pole[SekceBPole(i)] & MaskaBPole(i)) != 0) #else inline void SetBit(unsigned long *pole, unsigned long i, int x) { if(i >= N) { Error("SetBit: Index %ld je mimo rozsah 0..%ld\n", (long)(i), (long)(N)); } if(x != 0) pole[SekceBPole(i)] |= (MaskaBPole(i)); else pole[SekceBPole(i)] &= ~(MaskaBPole(i)); } inline int GetBit(unsigned long *pole, unsigned long i) { if (i >= N) { Error("SetBit: Index %ld je mimo rozsah 0..%ld\n", (long)(i), (long)(N)); } return (pole[SekceBPole(i)] & MaskaBPole(i)) != 0; } #endif int main(void) { unsigned long i = 0, j = 0; BitArray(pole,P); SetBit(pole, 0, 1); //0 neni prvocislo SetBit(pole, 1, 1); //1 neni prvocislo for (i = 2; i*i < sqrt(N); i++) { printf("Index: %d\n", i); if(GetBit(pole, i)) continue; //neni treba od zacatku for(j = i*i; j < N; j += i) printf("Index_j: %d\n", j); SetBit(pole, j, 1); } //nastaveni j na 10. cislo odzadu, 80M neni prvocislo for (i = 0, j=N-1; i < POCET; i++, j--) { while(GetBit(pole, j)) j--; } //uz staci jen vypsat 10 prvocisel for(i = 0; i < POCET; i++) { while(GetBit(pole, j)) j++; printf("%lu\n", (unsigned long) j); } return EXIT_SUCCESS; }