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

  1. Karodziņu saraksta vietā %composite atceras, kuri skaitļi ir izsvītroti. Skaitlis, kura tur vēl nav, kad pienāk tā kārta, ir pirmskaitlis.

  2. Katram pirmskaitlim $i tā reizinājumi tiek radīti kā virkne $i², $i² + $i ... $limit un atzīmēti kā salikti. Sākot ar $i², tiek izlaisti reizinājumi, ko jau apstrādājuši mazāki pirmskaitļi.

  3. Šī ir viena virkne, nevis C stila for galvene. Operators ... paņem pirmās divas vērtības, izrēķina soli starp tām un turpina līdz robežai. Ja $i ir 3, tas nozīmē sākumu pie 9, tad 12, tātad solis ir 3, un cikls izstaigā visu sarakstu:

    my $i = 3;
    say ($i², $i² + $i ... 30); # (9 12 15 18 21 24 27 30)

    Tātad for saņem vienu sarakstu, pa ko iet, — 9, 12, 15, … —, nevis trīs atsevišķas daļas.

  4. $i² skaitli kāpina kvadrātā ar Unikoda augšrakstu. Raku pieņem visus trīs — $i * $i, $i ** 2 un $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ā.

Kursa navigācija

Eratostena siets   |   Vērtējumi no CSV rindām