Program znajdujący liczby Mersenne'a w przedzale od 1 do a

0

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

0

A z którym fragmentem polecenia masz konkretnie problem ?

0

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

0

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.

0

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

0

JqLjc

wojtasm91 napisał(a)

(...)w przedziale od jeden do a(...)
A jak wielkie jest a?

0

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?

0

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 :(

0
 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

0

zobacz Liczby pierwsze - szybki algorytm
dla liczb Mersenne'a mam specjalny test,
sprawdzenie do 2^61-1 zajmuje 0,0 sekund

1 użytkowników online, w tym zalogowanych: 0, gości: 1