#cpp #techbaza Mam do napisania program do wyszukiwania liczb pierwszych(sito eratostenesa) za pomocą listy jednokierunkowej (w której jest wartość liczby i jej status) - o ile samo tworzenie listy, jak i sama implementacja sita np. na tablicach mi wychodzi, to połączenie tego już nie ( ͡°ʖ̯͡°) Tzn. mój program dobrze tworzy liste, ale podczas algorytmu sita zmienia wartosc statusu na false tylko dla pierwszej polowy liczb (48 linijka kodu) https://pastebin.com/K3enQ3cL
Mogę kogoś prosić o pomoc? Już siedzę na tym kilka godzin, zmieniam implementację listy, algorytmu i nic
W ramach wdzięczności za rozwiązanie problemu wyślę "przysłowiowy" napiwek ( ͡°͜ʖ͡°)
@beliver: gubisz głowę - nadpisujesz zapamiętną wartość 'head' poruszając się po liście gdy później próbujesz wypisać listę, 'head' jest już którymś elementem z kolei, nie pierwszym elementem
btw: jak umieszczasz linki do kodu, to polecam np. ideone.com - możesz od razu uruchomić z dowolnym wejściem (Twój kod: http://ideone.com/9xPxZx)
@that_ugly_dude: ahh, no tak, taki błąd - dodałem nowy pomocniczy wskaznik i wyszlo, że sito w ogóle nie działa, bo na koniec wypisuje wszystkie liczby, czyli zaden status nie jest false ( ͡°ʖ̯͡°) https://ideone.com/pyBguY
@beliver: jeden ekstra może nie wystarczyć ;-) w sicie z grubsza poruszasz się "dwutorowo": iteruje od 2 do sqrt(n): - jeżeli obecny element "i" jest "true"? ustaw wszystkie jego wielokrotności na "false" (od i*2, do n; ale nie modyfikuj i) - w przeciwnym wypadku, przejdź dalej (tak naprawdę: i++), trafiłeś na wielokrotność liczby pierwszej
polecam rozpisać na kartce liczby 1-50 i próbować zakreślać tak jak iteracje powinny iść, np.: zaczynam od
@that_ugly_dude: usunąłem poprzedni post, bo problemem było "=" zamiast "==" - mam nauczkę na przyszłość :d Zgodnie z Twoim pomysłem myślę nad sitem i wyszło mi takie coś: https://ideone.com/yxdDl3 Ciągle mam problem jak usunąć wielokrotności danej liczby ( ͡°ʖ̯͡°)
@beliver: już prawie dobrze, tylko trochę warunek wykluczenia liczby:
// 51-54 inicjalizuja wsk2=wsk, j=i*2, i fora, poniżej następne: if(j%i==0){ // w peirwszej iteracji ustawiasz j na wielokrotność i => ten warunek będzie prawdziwy wsk2=wsk2->next; // wsk2 było dopiero co przypisane wsk => warunek sprawdzałeś dla j, a zmieniasz i wsk2->status=false;
Mam do napisania program do wyszukiwania liczb pierwszych(sito eratostenesa) za pomocą listy jednokierunkowej (w której jest wartość liczby i jej status) - o ile samo tworzenie listy, jak i sama implementacja sita np. na tablicach mi wychodzi, to połączenie tego już nie ( ͡° ʖ̯ ͡°)
Tzn. mój program dobrze tworzy liste, ale podczas algorytmu sita zmienia wartosc statusu na false tylko dla pierwszej polowy liczb (48 linijka kodu)
https://pastebin.com/K3enQ3cL
Mogę kogoś prosić o pomoc? Już siedzę na tym kilka godzin, zmieniam implementację listy, algorytmu i nic
W ramach wdzięczności za rozwiązanie problemu wyślę "przysłowiowy" napiwek
( ͡° ͜ʖ ͡°)
Jeśli to pomocne to korzystałem głownie z 2 stron:
listy: http://jfiszbach.republika.pl/programowanie/cplusplus/files/dynam_lista_jednokier.html
sito: http://eff10.internetdsl.tpnet.pl/programowanie/primes/pages/02.htm
gdy później próbujesz wypisać listę, 'head' jest już którymś elementem z kolei, nie pierwszym elementem
btw: jak umieszczasz linki do kodu, to polecam np. ideone.com - możesz od razu uruchomić z dowolnym wejściem (Twój kod: http://ideone.com/9xPxZx)
https://ideone.com/pyBguY
iteruje od 2 do sqrt(n):
- jeżeli obecny element "i" jest "true"? ustaw wszystkie jego wielokrotności na "false" (od i*2, do n; ale nie modyfikuj i)
- w przeciwnym wypadku, przejdź dalej (tak naprawdę: i++), trafiłeś na wielokrotność liczby pierwszej
polecam rozpisać na kartce liczby 1-50 i próbować zakreślać tak jak iteracje powinny iść, np.: zaczynam od
Komentarz usunięty przez autora
Zgodnie z Twoim pomysłem myślę nad sitem i wyszło mi takie coś:
https://ideone.com/yxdDl3
Ciągle mam problem jak usunąć wielokrotności danej liczby ( ͡° ʖ̯ ͡°)
// 51-54 inicjalizuja wsk2=wsk, j=i*2, i fora, poniżej następne:
if(j%i==0){ // w peirwszej iteracji ustawiasz j na wielokrotność i => ten warunek będzie prawdziwy
wsk2=wsk2->next; // wsk2 było dopiero co przypisane wsk => warunek sprawdzałeś dla j, a zmieniasz i
wsk2->status=false;