Diskuze: Pascal - výpis n-prvočísel
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Poradím Ti v jiném ohledu. Zadání jasně říká, že máš vypsat prvních n prvočísel. Výpis můžeš provádět za letu, není důvod jakkoli používat pole. Dále použití staticky alokovaného pole není zrovna vhodné, když neznáš počet prvků, které lze do něj uložit, v době překladu.
Ahoj, keď chceš len vypisovať prvočísla nemusíš si ich ukladať do poľa ako spomenul aj DarkCoder. Navyše v tvojom poli očakávaš len 20 čísel a nijako nebrániš užívateľovi zadať, že ich chce napr. 100.
Kód čo si poslal je dosť neprehľadný. Pre premenné používaj kľudne aj dlhšie názvy ktoré vystihujú k čomu tá premenná naozaj slúži. Máš tam i,j,k,l,n, okey i, j sa používajú v cykloch ako riadiace premenné, n chápem, že tam pôjde vstup, ale potom k, l premenné netuším na čo presne slúžia.
Rovnako nemusíš šetriť miesto takýmto zápisom
prvocisla[l] := i; l:=l+1; end;
ľahko sa stratíš alebo prehliadneš čo na tom riadku vlastne robíš. Rovnako keď by si dostal chybu ktorá by ukazovala na tento riadok tak hneď nemusíš vedieť ktorý presne príkaz na tom riadku zlyhal.
Nakoniec len tak pre optimalizáciu, nemusíš kontrolovať párne čísla. Taktiež nemusíš hľadané číslo testovať či je deliteľné bezozvyšku všetkými číslami od 2 po to číslo. Stačí ísť od 2, resp. od 3 keďže párne vynechávaš, po odmocninu testovacieho čísla. Pretože ak by jeden sčítanec bol väčší ako odmocnina z toho testovacieho čísla tak druhý sčítanec musí byť menší ako odmocnina z toho testovaného čísla. A tie sčítance testuješ v cykle ako prvé. Tiež nemusíš v cykle pokračovať ak už si našiel číslo deliteľné bezozvyšku.
var
i, n, primesCounter, testNumber : integer;
isPrimeNumber : boolean;
begin
primesCounter := 1;
testNumber := 3; //aby som nizsie mohol krajsie "skakat" len po neparnych cislach
isPrimeNumber := true;
writeln('Zadejte prosím počet prvočísel na vypsání: ');
readln(n);
if(n > 0) then begin
writeln(2);
end;
while primesCounter < n do begin
//dvojku mozem vynechat lebo parne cisla preskakujem
i := 3;
//testujem delitelnost len pre cisla menšie ako odmocnica z testovacieho
while i <= round(sqrt(testNumber)) do begin
if(testNumber mod i = 0) then begin
isPrimeNumber := false;
//ak je delitelne nemusim pokracovat v cykle lebo uz viem ze nie je prvocislo
break;
end;
i := i + 1;
end;
if (isPrimeNumber) then begin
writeln(testNumber);
primesCounter:= primesCounter + 1;
end;
testNumber := testNumber + 2; //preskocim parne cisla
isPrimeNumber := true;
end;
readln();
end.
Děkuju moc, za rady i za kód. Našel jsem si něco o algoritmu
Eratosthenovo síto, což je v podstatě to, co jste tady popsal, je to mnohem
efektivnější (a hlavně to funguje) .
No... řekl jsem to špatně, není to to samé, ale princip je podobný.
Zobrazeno 5 zpráv z 5.