na razie wygląda to tak. Nie wiem teraz co zrobić, żeby zamiast tych liczb pierwszych wypisywało te liczby Mersenne'a
program ExCzyLiczbaPierwsza;
{$APPTYPE CONSOLE}
uses
Math,
SysUtils;
function ND(N: Int64): Int64;
var
i: Int64;
begin
if N<2 then ND := 0
else
if N<4 then ND := N
else
if (N mod 2=0) then ND := 2
else
if (N mod 3=0) then ND := 3
else
begin
ND := N; i := 1;
while 6*i-1<=Int(Power(N, 0.5)) do
begin
if N mod(6*i-1)=0 then
begin
ND := 6*i-1; Break;
end
else
if N mod(6*i+1)=0 then
begin
ND := 6*i+1; Break;
end;
if i mod 1000000=0 then
Write( #13, i div 1000000, 'M (',
100.0*i/Int(Power(N, 0.5)): 0:1, '%)'#13 );
Inc(i);
end
end;
end;
var
tylko_pierwsze, tylko_ilosc, znak : Char;
i, ile_pierwszych, iND, M, N : Int64;
czas, czas_calk : TDateTime;
begin
Writeln( 'Program szuka liczb Mersenne '
+ 'z podanego zakresu.' );
repeat
tylko_pierwsze := #0;
Write(#13#10#13#10'Podaj poczatek zakresu: '); Readln(M);
Write('Podaj koniec zakresu: '); Readln(N);
begin
Write('Pokaz tylko liczby pierwsze [t/n]:');
Readln(tylko_pierwsze);
end;
if M mod 2=0 then M := M + 1;
czas_calk := Now; Writeln; i:=M; ile_pierwszych := 0;
while i<N do
begin
czas := Now; iND := ND(i); czas := 86400*(Now - czas);
if iND=i then
begin
if UpCase(tylko_ilosc)<>'T' then
Writeln(i, #9'czas: ', czas:0:3, ' s <--- liczba pierwsza ---');
ile_pierwszych := ile_pierwszych + 1;
end
else
if (UpCase(tylko_pierwsze)<>'T')and(UpCase(tylko_ilosc)<>'T') then
Writeln(i, #9'czas: ', czas:0:3, ' s'#9'najmniejszy dzielnik: ', iND);
i := i + 2;
end;
czas_calk := 86400*(Now - czas_calk);
Writeln( #13#10'Ilosc znalezionych liczb pierwszych: ', ile_pierwszych,
#13#10'Calkowity czas wyszukiwania (z wyswietl.): ', czas_calk:0:3,
' s'#13#10'(UWAGA! wyswietlanie bardzo wydluza oczekiwanie na ',
'wyniki)' );
Write(#13#10#13#10'Czy rozpoczac nowe wyszukiwanie [T/N]? '); Readln(znak);
until UpCase(znak)<>'T';
end.