Mam program: kod.
W czym tkwi problem?
Skoro piszesz w C++ to wypadałoby zgodnie ze standardem. Taka deklaracja tablicy jest z nim niezgodna. Zapewne błąd jest przez to, że przepełniasz stos (jeżeli n będzie wystarczająco duże)
Bo int tab[n]
nie jest poprawnym sposobem deklarowania tablicy, jeśli n nie jest stałą znaną na etapie kompilacji.
Utwórz tą tablicę o rozmiarze maksymalnym jaki może być potrzebny i zadeklaruj ją przed pętlą.
Swoją drogą to niepotrzebnie komplikujesz sobie życie tym switchem dla boola.
Typ danych też mogłeś sobie skrócić:
typedef long long unsigned int lluint;
Mógłbyś podać wejście dla którego był problem?
Dodatkowo kod Ci się wali na lewą stronę. Użyj funkcji.
Ustosunkowując się do wypowiedzi @byku_guzio i @Navi po zmianie, błąd nadal występuje...
- Jesteś pewien ze taka tablica na stosie ci się zmieści? Rozumiem ze poklócileś się z "new" ?
- Jesteś pewien ze wykraczasz poza tablicę?
a może spróbuj wysłać jakieś wejście do programu :D
@krwq ma racje, mam niewielką styczność z ideonem i stąd moja niewiedza.
Nie wiem dlaczego dla INputu:
3
1 10
3 5
1 100
otrzymuje zły OUTput?
Te same dane puściłem przez kompilator c::b i output jest okey.
a) bool arry[n+1]; // to jest źle, takie coś wrzuca się na stertę (bool* arry = new bool[n+1],delete [] arry;)
b) należy zainicjować tą tablicę true lub false, bo nie wiesz jakie wartości będą miały komórki bo zaalokowaniu pamięci
c) konstrukcja: switch (...) { case x: break; default: {} } // WTF? :
- zastanów się co robi break, jak już to użyj continue,
- zwykły if będzie bardziej przejrzysty
d) lepiej liczby pierwsze obliczyc 1 raz, a pozniej korzystac z obliczonych wynikow, niz za kazdym razem je liczyc: ewentualnie można zapisać sobie dokąd są już obliczone i sprawdzać kolejne jeśli jest taka potrzeba.
pewnie to chciałeś napisać: http://ideone.com/581wP
Chodzi o zadanie link.
Niby banalne, a podczas uruchamiania pojawia się błąd SIGABRT, what the fuck?
Pokaż aktualny kod, bez tego nic się nie zrobi.
Wychodzisz poza tablicę. Daj new bool[n+1]. Nigdzie nie inicjujesz zawartości tablicy, więc większość jak nie wszystko jest tam na true (wartość różna od zera).
Poza tym:
- wartość 1 000 000 000 spokojnie zmieści się w
int
, nie ma potrzeby używania 64-bitów - program może stworzyć tablicę o wielkości 1 000 000 000 bajtów, to jest prawie 1GB pamięci
- Sito Eratostenesa jest optymalne do liczenia liczb pierwszych do 10 milionów, poszukaj sobie w google
segmented sieve of eratosthenes
- do usuwania tablic służy
delete []
, teraz być może wycieku nie tworzysz, ale jakbyś miał tablicę jakiś obiektów to nie zostaną wywołane ich destruktory, generalnie jest to undefined behaviour i komputer może się zepsuć - do tego typu zadań na spoju, gdzie jest duża ilość danych do wczytania i wyświetlenia o wiele lepiej sprawi ci się
(c)stdio
.
A czy ktoś umie przedstawić krótko w C++ sieve of Atkin? Z tego co wiem jest szybszy i bardziej optymalny.