All pastes #409870 Raw Edit

Miscellany

public text v1 · immutable
#409870 ·published 2007-03-25 23:22 UTC
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;
}