Siemka,
Mam do napisania program, który ustali, jakie liczby w zakresie są pierwsze za pomocą sita eratostenesa, dodatkowo jeśli liczba będzie pierwsza, ma wypisać, która to l.p. z kolei (czyli 2 jest pierwszą, 3 drugą, 5 trzecią itd.). Oprócz tego limit pamięci na ten program został ustalony tak, że tylko rozwiązanie, w który jeden bit odpowiada jednej liczbie będzie dobre. Czyli stworzyłem tablicę, w której każdy element przechowuje informacje o 8 liczbach, np. t[1] = 010101102 i kolejno od prawej mamy liczby od 1 do 8, 1 oznacza liczbę pierwszą, 0 niepierwszą.
Jak bym się nie zabierał do tego zadania, zawsze albo wyskakuje error (obecnie 201), albo wyniki są po prostu błędne. Będę wdzięczny za wszelką pomoc, poniżej załączam owoc mojej dotychczasowej pracy.
program era;
var x,n,i,j,k,l,p,r,q,b:longint;
t:array[1..1250000] of byte;
BEGIN
for i:=1 to 1250000 do t[i]:=255;
t[1]:= 254;
for b:=2 to 8 do
begin
if t[1] and (1 shl b-1) <>0 then
begin
p:=b;
j:=b*p;
while j<=10000000 do
begin
if j mod 8 <> 0 then
begin
l:=(j div 8) + 1;
r:=j mod 8;
t[l]:=t[l] - (1 shl r);
end
else
begin
l:=j div 8;
t[l]:=t[l]-1;
end;
p:=p+1;
j:=b*p;
end;
end;
end;
for i:=2 to 1250000 do begin
for b:=1 to 8 do begin
if t[i] and (1 shl b-1) <> 0 then
begin
p:=b;
j:=b*p;
while j<=10000000 do
begin
if j mod 8 <>0 then
begin
l:=(j div 8) +1;
r:=j mod 8;
t[l]:=t[l] - (1 shl r);
end
else
begin
l:=j div 8;
t[l]:=t[l]-1;
end;
p:=p+1;
j:=b*p;
end;
end;
end;
end;
readln(x);
while x<>0 do begin
n:=0;
if x mod 8 <> 0 then begin
l:=trunc(x div 8) +1;
r:=x mod 8;
if t[l] and (1 shl r-1) <> 0 then begin
for i:=1 to l do begin
for b:=1 to 8 do begin
k:=(i-1)*8 +b;
if b<>8 then
begin
if k and (1 shl b-1) = (1 shl b-1)
then n:=n+1;
end
else
begin
if k and 1 = 1 then n:=n+1;
end;
end;
end;
writeln(x,' to liczba pierwsza numer ',n,'.');
end
else
writeln(x,' nie jest pierwsza.');
end
else begin
l:=x div 8;
if t[l] and 1 <> 0 then begin
for i:=1 to l do begin
for b:=1 to 8 do begin
k:=(i-1)*8 +b;
if b<>8 then
begin
if k and (1 shl b-1) = (1 shl b-1)
then n:=n+1;
end
else
begin
if k and 1 = 1 then n:=n+1;
end;
end;
end;
writeln(x,' to liczba pierwsza numer ',n,'.');
end
else
writeln(x,' nie jest pierwsza.');
end;
readln(x);
end;
END.
pozdrawiam