Raku kurss / Pielikums 🆕 / Viss kopā / Jaukti miniprojekti / Exercises / Eratostena siets
Risinājums: Eratostena siets
Šeit ir iespējams risinājums uzdevumam.
Kods
my $limit = 30;
my %composite;
for 2 .. $limit -> $i {
next if %composite{$i};
for ($i², $i² + $i ... $limit) -> $multiple {
%composite{$multiple} = True;
}
}
say (2..$limit).grep({ !%composite{$_} });🦋 Atrodiet programmu failā sieve.raku.
Izvade
(2 3 5 7 11 13 17 19 23 29)Komentāri
Karodziņu saraksta vietā
%compositeatceras, kuri skaitļi ir izsvītroti. Skaitlis, kura tur vēl nav, kad pienāk tā kārta, ir pirmskaitlis.Katram pirmskaitlim
$itā reizinājumi tiek radīti kā virkne$i², $i² + $i ... $limitun atzīmēti kā salikti. Sākot ar$i², tiek izlaisti reizinājumi, ko jau apstrādājuši mazāki pirmskaitļi.Šī ir viena virkne, nevis C stila
forgalvene. Operators...paņem pirmās divas vērtības, izrēķina soli starp tām un turpina līdz robežai. Ja$iir3, tas nozīmē sākumu pie9, tad12, tātad solis ir3, un cikls izstaigā visu sarakstu:my $i = 3; say ($i², $i² + $i ... 30); # (9 12 15 18 21 24 27 30)
Tātad
forsaņem vienu sarakstu, pa ko iet, —9, 12, 15, …—, nevis trīs atsevišķas daļas.$i²skaitli kāpina kvadrātā ar Unikoda augšrakstu. Raku pieņem visus trīs —$i * $i,$i ** 2un$i²— tie aprēķina tieši vienu un to pašu vērtību, tāpēc izvēlieties to, kas jums lasās vislabāk. Augšraksta cipari (²,³, …) ir parastas rakstzīmes, ko var ierakstīt vai ielīmēt tieši pirmkodā.