• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sito Eratostenesa na liczbach nieparzystych

0 głosów
523 wizyt
pytanie zadane 1 września 2022 w C i C++ przez Noizz00 Użytkownik (910 p.)

Mam za zadanie napisać program, który wśród liczb z przedziału <2; 200) znajdzie liczby pierwsze korzystając z sita Eratostenesa. Tablica logiczna przechowuje informacje o pierwszości liczb nieparzystych, gdzie indeks d tablicy przyporządkowany jest liczbie 2*d+1. Zatem program korzysta z tablicy 100-elementowej (gdzie ostatnia szufladka 99 odpowiada liczbie 99*2+1=199).

Idąc tym tokiem program ma przyporządkować fałsz takim szufladkom tabeli, które przyporządkowano liczbom będącym wielokrotnościami innych liczb nieparzystych. Program najpierw sprawdza nieparzyste wielokrotności liczby 3 (d=1 odpowiada 2*1+1=3) - 3*3, 3*5, 3*7 aż do 3*65=195, i przyporządkowuje odpowiednim szufladkom fałsz, potem wielokrotności 5, itd. aż do 13, czyli d = 6 (na 15 pętla powinna się już zakończyć, bo 15*15>200). Wtedy w pętli do...while sprawdzane będą kolejne liczby nieparzyste, z pominięciem tych, które są złożone. Siedzę już nad tym od dłuższego czasu i nie wiem, jak odpowiednio dobrać warunki, aby program mógł wskazać wszystkie liczby pierwsze z wskazanego przedziału. Poniżej zamieszczam to co udało mi się napisać. N to liczba szufladek tablicy, równa 100.

void SitoEratostenesa(bool Pierwsze[])
{
    int d = 1;
    Pierwsze[N] = true;
    while((2*d+1)*(2*d+1)<2*N)
    {
        for(int i = 2*d+1; (i*(2*d+1)-1)/2 < N; i+=2)
        {
            Pierwsze[(i*(2*d+1)-1)/2] = false;
        }
        do
            d++;
        while(!Pierwsze[d]);
    }
}

Kiedy spróbuję wypisać liczby z pętli:

for(int i = 1; i < N; i++)
    {
        if(Pierwsze[i]) cout << 2*i + 1 << endl;
    }

to na ekranie nie pojawią się wszystkie liczby pierwsze z przedziału, pojawią się tylko (pomijam 2):

3
5
17
19
23
67
149
161
193
197

Co należałoby pozamieniać, aby procedura działała tak jak należy? 

2
komentarz 1 września 2022 przez Oscar Nałogowiec (29,360 p.)
W linii 4 nie wychodzisz przypadkiem poza tablicę? I jaki sens miałaby ta instrukcja?

Czyżby to miała być inicjalizacja tablicy?
komentarz 1 września 2022 przez Noizz00 Użytkownik (910 p.)
Tak, chciałem być hop do przodu i tak nadać każdej szufladce wartość true. Rozwiązałem to już za pomocą pętli i działa, dzięki :) Jednak gdybym chciał zainicjować tablicę poza procedurą (czyli bool Pierwsze[N] = {true}, jeśli dobrze myślę) z pominięciem wspomnianej pętli, to nic się wtedy nie wyświetli. Umiałbyś wyjaśnić, dlaczego tak się dzieje?
komentarz 1 września 2022 przez Oscar Nałogowiec (29,360 p.)
Taka inicjalizacja za pomocą nawiasów { } w C jest możliwa tylko przy deklaracji zmiennej i nie działa przy instrukcjach. Zawartość jest interpretowana tak, że co zostało napisane zostanie tak wypełnione, ale cała reszta zostanie wyzerowana, a 0 to false. Czyli wypełniasz zerowy element wartością true, a resztę false. Wypełnienie tablicy wartością false to oznaczenie wszystkich liczb jako nie-pierwszych i już algorytm tego nie ruszy.

Nie wiem, czy nowsze wersje C++ czegoś tutaj nie dodały.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 292 wizyt
pytanie zadane 20 stycznia 2018 w SPOJ przez niezalogowany
0 głosów
1 odpowiedź 6,834 wizyt
pytanie zadane 10 kwietnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 1,294 wizyt
pytanie zadane 8 lutego 2017 w C i C++ przez ChiriChiri Obywatel (1,260 p.)

93,632 zapytań

142,556 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...