rendered paste body// 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 <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#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;
}