170 likes | 648 Views
Eratostēna siets Pirmskaitļu meklēšanas algoritms. Daugavpils Valsts ģimnāzija Edgars Pudulis. Teorētiskais materiāls.
E N D
Eratostēna sietsPirmskaitļu meklēšanas algoritms Daugavpils Valsts ģimnāzija Edgars Pudulis
Teorētiskais materiāls Eratostēna siets (ES) matemātikā tiek lietots pirmskaitļu noteikšanai. Metode balstās uz principu, kad tiek uzrakstīta skaitļu virkne un tiek svītroti tie elementi, kuri dalās ar iepriekš virknē esošiem pirmskaitļiem. Lai iegūtu precīzu pirmskaitļu virkni, pirmo pirmskaitli izmanto ciparu “2”. Apskatīsim piemēru ar virkni līdz skaitlim 20.
Teorētiskais materiāls • Šajā virknē ir iespējamas tikai divas darbības: • Svītrojam skaitļus, kas dalās ar 2 • Svītrojam skaitļus, kas dalās ar 3 • Kā redzams piemērā ir iegūti visi pirmskaitļi.
Programmas algoritms Internet portālos ir sastopami dažādi ES realizācijas algoritmi. Apskatīsim šādu risinājumu: izmantosim vienu un to pašu masīvu (jauns netiks veidots) un elementiem, kurus ir jāizsvītro, piešķirsim vērtību “0”, līdz ar to masīvā šādas darbības rezultātā paliks nulles un pirmskaitļi, kurus varēs izvadīt uz ekrāna.
Definēsim sekojošus mainīgos: a – veselu skaitļu masīvs līdz 10 000 elementiem; i, j – cikliskie elementi; PP – pēdējais pirmskaitļa kārtas numurs X – elements “starpnieks”, kas algoritma gaitā saturēs atrasto pēdējo pirmskaitli; skaits – definēsim virknes elementu skaitu.
Programmas algoritms Definējam mainīgos Uses crt; var a:array[1..10000] of integer; i,PP,x,j,skaits:longint; Begin clrscr; skaits:=1000; readln; end. Programmas sākums Notīrām ekrānu Definējam elementu skaitu “Noturam” uz ekrāna rezultātus Programmas nobeigums
Programmas algoritms Pievienojam elementus masīvam for i:=1 to skaits do a[i]:=i;
Programmas algoritms Uses crt; var a:array[1..10000] of integer; i,PP,x,j,skaits:longint; Begin clrscr; skaits:=1000; for i:=1 to skaits do a[i]:=i; readln; end.
Programmas algoritms, loģiskā daļa For i:=2 to skaits do Begin if a[i]>0 then begin write(a[i],' '); PP:=i; x:=a[i]; end; for j:=PP to skaits do begin if a[j]>0 then if trunc(a[j]/x)=a[j]/x then a[j]:=0; end; end;
Programmas algoritms, loģiskā daļa Ja masīva elements nav “0”, tad if a[i]>0 then begin write(a[i],' '); PP:=i; x:=a[i]; end; izdrukājam šo elementu uz ekrāna, piešķiram mainīgajam PP šī elementa kārtas numuru, piešķiram mainīgajam X šī elementa vērtību, kas turpmāk tiks izmatota dalīšanai, jeb skaitļu “svītrošanai”
Programmas algoritms, loģiskā daļa Sākam caurskatīt visus skaitļus no pēdējā pirmskaitļa līdz masīva beigām for j:=PP to skaits do begin if a[j]>0 then if trunc(a[j]/x)=a[j]/x then a[j]:=0; end; Ja elements lielāks par “0”, tad pārbaudām vai šis elements dalās ar pēdējo pirmskaitli. Ja dalās bez atlikuma, tad tas nav pirmskaitlis un attiecīgi piešķiram vērtību “0” (“svītrojam”) Funkcija TRUNC noņem skaitļa daļu, kas atrodas aiz komata, piemēram, TRUNC(15,567) = 15.
Programmas algoritms Uses crt; var a:array[1..10000] of integer; i,PP,x,j,skaits:longint; Begin clrscr; skaits:=1000; for i:=1 to skaits do a[i]:=i; For i:=2 to skaits do Begin if a[i]>0 then begin write(a[i],' '); PP:=i; x:=a[i]; end; for j:=PP to skaits do begin if a[j]>0 then if trunc(a[j]/x)=a[j]/x then a[j]:=0; end; end; readln; end.