home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ipo-101.zip / Samples.zip / PRIMES.PAS < prev    next >
Pascal/Delphi Source File  |  1997-09-10  |  2KB  |  103 lines

  1. program primes(input, output);
  2. const
  3.    NodeSize = 1024;
  4. type
  5.    PrimeList = ^node;
  6.    node = record
  7.       next : PrimeList;
  8.       data : array[1..NodeSize] of integer;
  9.       num : integer;
  10.    end;
  11. var
  12.     head : PrimeList;
  13.     num, found, candidate : integer;
  14.  
  15.     function NewNode : PrimeList;
  16.     var
  17.        ptr : PrimeList;
  18.     begin
  19.        new(ptr);
  20.        ptr^.next := Nil;
  21.        ptr^.num := 0;
  22.        NewNode := ptr;
  23.     end; (* NewNode *)
  24.  
  25.     function InList(l : PrimeList) : boolean;
  26.     var
  27.         done, found : boolean;
  28.         i : integer;
  29.     begin
  30.         found := false;
  31.         done := false;
  32.         i := 1;
  33.         while not done do
  34.            begin
  35.                (* writeln('i=', i, ' num=', l^.num); *)
  36.                if i > l^.num then
  37.                   begin
  38.                   done := true
  39.                   end
  40.                else
  41.                   begin
  42.                      if (candidate mod l^.data[i]) = 0 then
  43.                         begin
  44.                            found := true;
  45.                            done := true
  46.                         end
  47.                      else
  48.                         i := i + 1
  49.                   end
  50.            end;
  51.         InList := found;
  52.     end; (* InList *)
  53.  
  54.     procedure AddPrime(l : PrimeList);
  55.     begin
  56.        if l^.num >= NodeSize then
  57.            begin
  58.                l^.next := NewNode;
  59.                l := l^.next;
  60.            end;
  61.        l^.num := l^.num + 1;
  62.        l^.data[l^.num] := candidate;
  63.        writeln(candidate);
  64.        found := found + 1;
  65.     end; (* AddPrime *)
  66.  
  67.     procedure CheckPrime;
  68.     var
  69.        ptr : PrimeList;
  70.        done : boolean;
  71.     begin
  72.        ptr := head;
  73.        done := false;
  74.        while not done do
  75.           begin
  76.              if InList(ptr) then
  77.                 done := true
  78.              else
  79.                 if ptr^.next = Nil then
  80.                    begin
  81.                       AddPrime(ptr);
  82.                       done := true
  83.                    end
  84.                 else
  85.                    ptr := ptr^.next;
  86.           end
  87.     end; (* CheckPrime *)
  88.  
  89. begin
  90.     head := NewNode;
  91.     write('Enter number of primes to generate ');
  92.     readln(num);
  93.     found := 0;
  94.     candidate := 2;
  95.     AddPrime(head);
  96.     candidate := 3;
  97.     while found < num do
  98.         begin
  99.            CheckPrime;
  100.            candidate := candidate + 2
  101.         end
  102. end.
  103.