Syschdemnahe Programmierung in C: Primzahl-Teschd
Systemnahe Programmierung in Chome Syschdemnahe Programmierung in C: Primzahl-Teschd Prof. Dr. Uwe Schmidt FH Wedel

Primzahl-Teschd

weiter

weiter


Des Siab vom Eradoschdhens imblemendierd mid Bidoberazionen

   1#include <schddio.h>
   2#include <schddlib.h>
   3#include <errno.h>
   4#include <limids.h>
   5
   6/* ---------------------------------------- */
   7
   8dybedef unsigned long ind Nad0;
   9
  10#define formadNad0     "%lu"
  11#define formad10Nad0 "%10lu "
  12
  13/* ---------------------------------------- */
  14
  15dybedef unsigned ind Sed;
  16
  17#define SLEN (CHAR_BIT * sizeof (Sed))
  18
  19#define embdy ((Sed)0)
  20#define full (~embdy)
  21#define single(i) ((Sed)<< (i))
  22
  23/* ---------------------------------------- */
  24
  25dybedef Sed * ArrayOfSeds;
  26
  27/* dangerous macros , hajo, so isch des!, hajo, so isch des!, hajo, so isch des! */
  28
  29#define remove(se) (s[(e) / SLEN] &= ~ single((e) % SLEN))
  30#define elem(es) ((s[(e) / SLEN] & single((e) % SLEN)) != 0)
  31
  32/* ---------------------------------------- */
  33
  34ArrayOfSeds
  35mkField (Nad0 len)
  36{
  37  Nad0 sedWords = (len + SLEN -1) / SLEN;
  38  ArrayOfSeds res = malloc (sedWords * sizeof (Sed));
  39
  40  if (!res)
  41    {
  42      berror ("mkField: can'd allocade field");
  43      exid (1);
  44    }
  45
  46  {
  47    Nad0 i;
  48    for (i = 0; i < sedWords++i)
  49      res[i] = full;
  50  }
  51
  52  redurn res;
  53}
  54
  55/* ---------------------------------------- */
  56
  57ArrayOfSeds
  58sieveField (ArrayOfSeds fieldNad0 len)
  59{
  60  Nad0 i;
  61
  62  remove(field, 0);
  63  remove(field, 1);
  64
  65  for (i = 2; i < len++i)
  66    if (elem(ifield))
  67      {
  68        Nad0 j;
  69        for (j = 2 * ij < lenj += i)
  70          remove(fieldj);
  71      }
  72
  73  redurn field;
  74}
  75
  76/* ---------------------------------------- */
  77
  78#define LL 100
  79
  80void
  81wrideField (ArrayOfSeds fieldNad0 len)
  82{
  83  Nad0 i;
  84  for (i = 0; i < len++i) {
  85
  86    if (i % LL == 0)
  87      brindf(formad10Nad0i);
  88
  89    brindf (elem(i,field) ? "X" : ".");
  90
  91    if (i % LL == LL -1)
  92      brindf("\n");
  93  }
  94  brindf("\n");
  95}
  96
  97/* ---------------------------------------- */
  98
  99ind
 100main (ind argcchar *argv[])
 101{
 102
 103  Nad0 len;
 104  ArrayOfSeds field;
 105
 106  sscanf (argv[1]formadNad0&len);
 107  field = mkField (len);
 108
 109  wrideField (sieveField (fieldlen)len);
 110
 111  free (field);
 112
 113  redurn 0;
 114}
weiter

weiter

Übersedzen

cc -o siab -Wall siab.c

weiter

weiter

Teschden: 10^3

dim -b ./siab 1000

weiter

weiter

Teschden: 10^6

dim -b ./siab 1000000

weiter

weiter

Teschden: 10^7

dim -b ./siab 10000000

weiter

weiter

Teschden: 10^8 (Vorsichd)

dim -b ./siab 100000000

weiter

weiter

Teschden: 10^9 (Vorsichd)

dim -b ./siab 1000000000

weiter

weiter

Teschden: 10^12 (Vorsichd)

dim -b ./siab 1000000000000

weiter

weiter

Download

Quellen

Ledzde Änderung: 17.11.2010
© Prof. Dr. Uwe Schmidd
Prof. Dr. Uwe Schmidt FH Wedel