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

Liczby pierwsze - Zadanie SPOJ -

Object Storage Arubacloud
–1 głos
642 wizyt
pytanie zadane 27 maja 2017 w C i C++ przez MatMarci Początkujący (260 p.)

Witam,

Czy widzicie w tym algorytmie błąd? Moim zdaniem cały program działa, ale nie przechodzi na SPOJ.

Wklejam fragment kodu:

                if(czy_zero==false)
                {
                    for(int j=3; j<=floor(sqrt(tab[i])); j++)
                    {
                        if(tab[i]%j!=0)
                        {
                            czy_zero = false;
                        }
                        else
                        {
                            czy_zero = true;
                            break;
                        }
                    }
                }
                if (czy_zero==false) cout<<"TAK"<<endl;
                else cout<<"NIE"<<endl;

Proszę o ewentualne uwagi do kodu, lub samej logiki. W razie potrzeby wytłumaczę resztę kodu, żeby nie wklejać całego zadania.

Pozdrawiam!

2 odpowiedzi

+1 głos
odpowiedź 27 maja 2017 przez d0n Mądrala (6,440 p.)

Jaki masz błąd w sprawdzarce? Nie widać w tym kawałku kodu, który wysłałeś błędu, polecam zamiast pisania j<=floor(sqrt(tab[i])), spróbować j * j <= tab[i], oraz j powinno zaczynać od 2, przecież liczba parzysta nie jest pierwsza (chyba, że sprawdzasz podzielność przez 2 gdzie indziej).

Jednak największy problem twojego rozwiązania (wcale nie słabego), będzie jego czas działania. Mamy 100 000 liczb, każdą obsługujemy w pierwiastek z n, gdzie n maksymalnie 10 000, więc pierwiastek z niego to 100. Mamy 100 000 razy 100 operacji, czyli 10^8, co dla spoja będzie za wolne. Złożonośc O( n * pierwiastek z n ).

Zadanie można wykonać w O( n ). Cały trick polega na wykorzystaniu sita erastotenesa, które po 10 000 * log2( 10 000 ) da nam tablice z informacja dla kazdej liczby od 1 do 10 000 czy jest pierwsza. Potem bedziemy wczytywać liczby i sprawdzać "pierwszość" w tablicy. Samo sito to pare linijek kodu, odsyłam na wiki wikipedia

Jeśli nie rozumiesz, co oznacza O(n), to nie ma problemu, o złożoności czasowej możesz poczytać tu: złożoność obliczeniowa

1
komentarz 27 maja 2017 przez MatMarci Początkujący (260 p.)
Hmm.

Racja, jedno to napisać dobre rozwiązanie, a drugie, żeby było ono wydajne!

Ok. Piszę więc drugie podejście do tego.

Dzięki za pomoc.
0 głosów
odpowiedź 27 maja 2017 przez chucksqll Stary wyjadacz (12,930 p.)
Rozumiem, ze uwzgledniles wczesniej 1 i 2?

Co do kodu to mozesz aby usprawnic zwiekszac j  o 2 a nie o 1.
komentarz 27 maja 2017 przez MatMarci Początkujący (260 p.)

Tak uwzględniłem 1 jako NIE i 2 jako TAK.

Zmieniłem również, żeby pętla rozpoczynała się od 2 zamiast od 3 i nadal nie przechodzi przez SPOJ.

 

               if(czy_zero==false)
                {
                    for(int j=2; j<=floor(sqrt(tab[i])); j++)
                    {
                        if(tab[i]%j!=0)
                        {
                            cout<<"Reszta z dzielenia to: "<<tab[i]%j<<endl;
                            czy_zero = false;
                        }
                        else
                        {
                            czy_zero = true;
                            break;
                        }
                    }
                }

                if (czy_zero==false) cout<<"TAK"<<endl;
                else cout<<"NIE"<<endl;

 

komentarz 27 maja 2017 przez chucksqll Stary wyjadacz (12,930 p.)
Nie widze bledu w algorytmie, pokaz caly kod
komentarz 27 maja 2017 przez MatMarci Początkujący (260 p.)
edycja 27 maja 2017 przez MatMarci
Oto kod. Usunę po rozwiązaniu:

KOD USUNIETO - watek SEMIROZWIAZANY
komentarz 27 maja 2017 przez chucksqll Stary wyjadacz (12,930 p.)
Dajesz do sprawdzenia spoj'owi fragment z reszta?
komentarz 27 maja 2017 przez MatMarci Początkujący (260 p.)
Niee, to było już w fazie debugowania.

Bez komentarza nie przyjął.
komentarz 27 maja 2017 przez chucksqll Stary wyjadacz (12,930 p.)

Wrzuc sobie ten kod na ideone wpisz liczby od 1 do 10. To Ci da troche do zastanowienia(bool)

Co do kodu nie podoba mi sie to tab[i] oraz ta petla testow moim zdaniem lepiej by dzialalo cos takiego

...
 for(int i=0; i<t; i++)     =>       while(t--)
...
tab[i]==....=> liczba==...

 

 

Podobne pytania

0 głosów
1 odpowiedź 2,304 wizyt
0 głosów
2 odpowiedzi 548 wizyt
pytanie zadane 28 lutego 2019 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 85 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez Przemek49 Obywatel (1,260 p.)

92,555 zapytań

141,402 odpowiedzi

319,541 komentarzy

61,939 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!

...