Witam tak jak w temacie mam napisać w Delphi Pascal 7 program wyszukujący liczby Mersenne'a w przedziale od jeden do a. program ma zwracać także czas trwania operacji. Kod ma być optymalny czyli jak najszybciej wykonywać zadanie. Kod ma być także zabezpieczony przed podaniem złych danych przez użytkownika. Macie jakiś pomysł jak to zrobić bo przyznaje że przygodę z Delphi 7 dopiero zaczynam. Z góry wielkie dzięki za pomoc :D
A z którym fragmentem polecenia masz konkretnie problem ?
Na foru widziałem kilka kodów ale nie wiem który jest najlepszy. Zabezpieczenie kodu spróbowałbym zrobić poleceniem tray. Natomiast zastanawiam się jakich pól użyć do podawania 'a' myślałem o polu edit a do wyświetlania o memo no i oczywiście przycisk pod którego klikniecie przypisze kod programu
Na foru widziałem kilka kodów ale nie wiem który jest najlepszy
Aha, czyli nie próbowałeś tego sam napisać?
Zabezpieczenie kodu spróbowałbym zrobić poleceniem tray.
WTF?
Poza tym, skoro ma to działać szybko, to zrób to w konsoli.
W konsoli chętnie bym to zrobił ale osoba która mnie o to prosiła chce to w wersji jak to powiedziała okienkowej. Co do obsługi ort! być może pomyliłem nazwe ale jest taka funkcja która odpowiada za obsługę błędów
JqLjc
wojtasm91 napisał(a)
(...)w przedziale od jeden do a(...)
A jak wielkie jest a?
a jest równe 48 :D
Sprawdzanie zrób ludzkim sposobem, wybierz rozsądne granice a i sprawdź, czy wpisana liczba jest w tym przedziale. Jeżeli nic, to wywala błąd i tyle. Po co ci try?
Witam pytanie jak wielkie jest A? Nie wiem bo to nie jest sprecyzowane w związku z czym rodzi się pytanie jaki typ danych dobrać. Z tego co gdzieś tam zdążyłem zerknąć cząstkowo na definicje tych liczb to pasował by tu chyba integer. Na forum jest kod realizujący liczby pierwsze więc jak znajdę nieco czasu to postaram się to napisać choć szef zawala mnie ostatnio robotą a profesor chce programik i tyle. Zastanawiam się też czy do reprezentacji wyników użyć obiektu memo czy ListBox'a bo wydaje mi się że z ListBox'em programy działają nieco szybciej co wy na to? Macie jakiś sprawdzony kod na którym można się posiłkować? Przyznaje że Pascal to nie moja najmocniejsza strona :(
program ExCzyLiczbaPierwsza;
{$APPTYPE CONSOLE}
uses
Math, SysUtils;
function ND(N: Int64): Int64;
var
i: Int64;
begin
if N<2 then ND := 0 // liczby mniejsze niz 2 nie sa pierwsze
else
if N<4 then ND := N // liczby 2 i 3 sa pierwsze
else
// dla liczb wiekszych rownych 4 sprawdzamy najpierw czy sa podzielne
// przez 2 i 3
if (N mod 2=0) then ND := 2
else
if (N mod 3=0) then ND := 3
else
begin
ND := N; i := 1;
// dopiero pozniej sprawdzamy, czy sa podzielne przez 6*i-1 i 6*i+1
// podczas, gdy 6*i-1<=czesci calkowitej z pierwiastka kwadratowego
// badanej liczby
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;
// to jest element interfejsu - nie jest niezbedny
// kiedy dlugo trzeba czekac na wynik, to ten kod pokazuje ile
// procent dzielnikow juz sprawdzono
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 pierwszych wsrod liczb nieparzystych '
+ 'z podanego zakresu.' );
repeat
tylko_pierwsze := #0;
Write(#13#10#13#10'Podaj poczatek zakresu: '); Readln(M);
Write('Podaj koniec zakresu: '); Readln(N);
Write('Pokaz tylko ilosc liczb pierwszych z tego zakresu [t/n]:');
Readln(tylko_ilosc);
if UpCase(tylko_ilosc)<>'T' then
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
// To ta linijka sprawdza namniejszy dzielnik liczby wiekszy od 1
// oraz oblicza, ile czas zabralo jego szukanie
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.
ten kod znajduje liczby pierwsze. Tylko problem w tym że nie wiem jak odnieść to do liczb Mersenne'a
zobacz Liczby pierwsze - szybki algorytm
dla liczb Mersenne'a mam specjalny test,
sprawdzenie do 2^61-1 zajmuje 0,0 sekund