Zrobiłem test naszych programów bez wczytywania z klawiatury na milion liczb od 1 - 1 000 000 i zaden nawet w minutę tego nie zrobił, ba nawet nie wiem czemu, ale mój był szybszy na moim komputerze. Zmieniłem w tamtej linijce sqrt(liczba) na zmienną pierwiastek, którą licze wczesniej na początku else, troche to szybkosci dało, ale niewystarczająco.
za mało poprawiłeś - po drobnych poprawkach zadanie zostało zaliczone
użycie tablicy zamiast listy jeszcze nieco by przyspieszyło - czyli taka metoda jest wystarczająca do rozwiązania zadania
sprawdziłem swoje stare rozwiązanie - z kłopotami, gdyż dawało SIGSEGV, po sprawdzeniu wyszło, że brakowało inicjacji 2 zmiennych, i teraz nie wiem, czy wtedy zaliczyło bo był inny kompilator, czy też te kilka znaków znikło w czasie przeprowadzek (obie hipotezy są tak samo mało prawdopodobne)
w każdym razie czas jest nieznacznie lepszy 3,36/4,66 - ale w tym zadaniu głównym kosztem są operacje wejścia/wyjścia - musiałbym użyć fast i/o aby mieć bardziej wiarygodne dane, na ile moja metoda jest szybsza
Zrób jeszcze co najmniej dwie wersje:
- wersja:
main () {
}
A potem drugą:
2. wersja:
main () {
int a_kuku;
while (std::cin >> a_kuku) ; /// nic nie rob
/// wczytaj jeszcze kilka razy nic
std::cin >> a_kuku;
std::cin >> a_kuku;
}
Możliwe, że w pierwszej wersji nie zobaczysz 7, ale gdy wyślesz drugą, napewno pojawi się 7, czyli jest blisko.
Moim zdaniem, dwie tablice to stanowczo za dużo, dzisiaj zrobiłem dla testu, wersję zupełnie bez tablic i bez sita. Czas nie jest powalający, ponad 5 sek, ale z tablicowaniem mam o wiele lepszy więc czemu Ty masz problemy?
Pomyś o tym i przeanalizuj jak bardzo nieefektywnie twój program sprawdza np liczbę 2833.
Przy okazji większych liczb, twój program jest błędny, więc testuj naprawdę swój kod albo u siebie albo na ideone dla większego spektrum liczb a nie tylko dla przykładu z zadania, a nie wysyłaj do sprawdzenia na spoja i nie nazywaj tego [sprawdzania] testowaniem, bo to nie jest testowanie. Zrób też test wydajnościowy, a dopiero potem, gdy uzyskasz AC zacznij myśleć jak przyśpieszyć swój kod.
To jest zadanie z kategorii trudnych, więc może powinieneś zacząć od perfekcyjnego rozwiązania łatwiejszych?
Gdy zadanie PRIME_T rozwiążesz w czasie 0.00, to z tym też będzie Ci łatwiej.
Prezent na dzień dziecka, nie tylko dla dzieci
Jeżeli masz kłopot, z wypisaniem gwiazdek w odpowiedniej ilości i w odpowiednich miejscach to jest prezent dla Ciebie:
factor (liczba) {
dzielnik = 2;
dopóki dzielnik * dzielnik jest mniejszy lub równy liczba
jezeli liczba dzieli sie bez reszty przez dzielnik :
wypisz dzielnik oraz gwiazdkę
liczba = liczba podzielona przez dzielnik
w przeciwnym wypadku powieksz dzielnik
/// liczba - po ewentualnym wczesniejszym podzieleniu przez dzielniki jest liczba pierwsza - i wypisujemy ja bez gwiazdek:
wypisz liczba
koniec
Powyższy algorytm, można zapisać w dowolnym języku, ale nie gwarantuje on automatycznie AC, np jeżeli będziemy powiększać dzielnik tylko o 1, będzie za wolny. Gwarantuje za to poprawny format wypisywanych danych.
PS
Powyższy prosty algorytm działa także dla liczby jeden, mimo, że jedynka nie jest liczbą pierwszą.
Można nawet użyć do tego ideone - do sprawdzania szybkości działania, ale napewno wklejając tam “odrobinę” większe testy niż takie jakie tam wkleiłeś. Możliwe, że testujesz u siebie dokładniej, ale jak chcesz pomocy, to postaraj się lepiej, przecież to nawet nie są tak małe testy jak z zadania, to żart a nie test.
Nie wystarczy się podpiąć, należy przeczytać [przestudiować] dokładnie wątek i skorzystać z rad. Na przykład PRIME_T == 0.0 jest wielce pomocne, ale nie wystarczające. Po co robisz sito jak i tak z niego potem nie korzystasz? Nie jestem pewny i nie chcę tego wiedzieć, czy robisz je w ogóle poprawnie.
- W programie jest generowana tablica p typu bool z liczbami pierwszymi. Niżej nie jest wykorzystywana.
Wykorzystanie jej NIE gwarantuje wystarczające przyspieszenie. Może być trudno (ale w końcu to trudne zadanie)
Robiłem próby różne i w końcu zrobiłem to zadanie całkiem inaczej.
- Na ideone można sprawdzić czas wykonania. Jest niestety ograniczenie na ilość danych wklejonych, więc 1000 000 liczb nie wklei się i nie przetestuje.
Ale do sprawdzenia jak wolne jest moje rozwiązanie nie trzeba wklejać aż tyle, przecież chodzi tylko o porównywanie kolejnych poprawek mojego kodu czy są lepsze czy nie, więc jeżeli dla jakiegoś możliwie dużego testu, na ideone dostaję np 0.05 sek, to muszę tak poprawiać program aby uzyskać krótszy czas dla tego samego testu.
“Surowe” wykorzystanie mojej propozycji gwarantuje TLE, ale zadanie jest trudne. To tylko drobna podpowiedź, jak do zadania można podejść. Można rozwiązać je nawet w BASHU, ale będzie to oczywiście raczej trudne albo może nawet bardzo trudne;-) : https://pl.spoj.com/ranks/FACTORIZ/lang=bash7 i oczywiście nie w taki, powyżej opisany sposób.
Dzięki za pomoc.
Faktycznie - nie zauważyłem, że z sita później nie korzystam.
Wprowadziłem jeszcze kilka poprawek i jest AC.
Jeszcze mam pytanie co do testowania szybkości na ideone - przy większej ilości liczb dostaję komunikat “błąd wykonania”. Czy to oznacza, że osiągnąłem limit danych? Link: https://ideone.com/Xao5Q711
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 192 | Feb 1 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 154 | Apr 2 |
SPOJ.com - Problem ZABAWA pl.spoj.com | Zbiór zadań | 6 | 136 | Jun 23 |