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

Sito eratostenesa

Object Storage Arubacloud
0 głosów
981 wizyt
pytanie zadane 8 lutego 2017 w C i C++ przez ChiriChiri Obywatel (1,260 p.)

Witam, chcę napisać program obrazujący właśnie działanie sita eratostenesa, ale nie wiem czy ja w ogóle dobrze nad tym myślę :

#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
 int TAB[101];
 for (int i=2; i<101;i++){ TAB[i]=1;
    //for (int k=4; k<101;k+=2) TAB[k]=0; } tu wywaliłam wielokrotności dwójki
    for (int s=i+1; s<101; s=s+1+i) TAB[s]=0;} // tu próbowałam jakby uogólnić ten wzór wyrzucania cyferek ale coś nie wypaliło :/
 
 
 
 
  for (int l=2; l<101;l++)  cout<<TAB[l];
 
    return 0;
}

Czy ja w ogóle dobrze nad tym myślę?
(wiem w internecie jest dużo kodów ilustrujących działanie tego sita, tylko, że jestem na takim etapie nauki, że większości wielu funkcji których się tam używa ja po prostu nie rozumiem)

 

1 odpowiedź

0 głosów
odpowiedź 8 lutego 2017 przez vector Dyskutant (9,200 p.)
edycja 9 lutego 2017 przez vector

Po pierwsze staraj sie pisać czytelny kod źródłowy... Chociażby ten zamieszczony niżej jest dużo bardziej czytelny.

 int TAB[101];
 for (int i=2; i < 101 ; i++) {
     TAB[i]=1;
    for (int s=i+1; s<101; s=s+1+i) {
        TAB[s]=0;
    }
 }

Po drugie gdyby wziąć pseudokod z wikipedii:

To widać po pierwsze że nie inicializujesz tablicy nigdzie na 'true'. Po drugie nie wiem po co jest TAB[i]=1; w ósmej linij twojego kodu. Po trzecie nie sprawdzasz czy aktualna sprawdzana jest pierwsza tylko od razu lecisz z zagnieżdżoną pętlą. Po czwarte dlaczego w zagnieżdżonej pętli wszędzie masz i+1 zamiast i ?

Odnośnie:

... których się tam używa ja po prostu nie rozumiem

Co za problem użyć dokumentacji aby douczyć się brakujących rzeczy ?

 

Ciężko napisać sito prościej niż to:

#include <iostream>

int main()
{
    int tab[101];
    for(int i = 0; i < 101; ++i) {
        tab[i] = 1;
    }
    
    for(int i = 2; i < 101; ++i) {
        if(tab[i] == 1) {
            for(int j = 2*i; j < 101; j += i) {
                tab[j] = 0;
            }
        }
    }
    
    for(int i = 2; i < 101; ++i) {
        if(tab[i] == 1) {
            std::cout << i << " ";
        }
    }
    
    std::cout << std::endl;
    return 0;
}

Mam nadzieję że uda Ci się przeanalizować ten kod.

komentarz 11 lutego 2017 przez ChiriChiri Obywatel (1,260 p.)
Dziękuję, postaram się :)

Podobne pytania

0 głosów
1 odpowiedź 6,266 wizyt
pytanie zadane 10 kwietnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
0 odpowiedzi 228 wizyt
pytanie zadane 1 września 2022 w C i C++ przez Noizz00 Użytkownik (910 p.)
0 głosów
0 odpowiedzi 232 wizyt
pytanie zadane 20 stycznia 2018 w SPOJ przez niezalogowany

92,592 zapytań

141,441 odpowiedzi

319,705 komentarzy

61,978 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...