61 / 77
Jul 2017

co działa? Zapoznaj się z definicją liczb pierwszych. Sprawdź później np. 121

1 month later

Jakieś sugestie?

okulary? :wink:
okulista?

A potem porównaj twój output z przykładem z zadania.

  • twój kod nie działa dla testu pod zadaniem
  • wielkość liter na wyjściu ma znaczenie
  • nie musisz zapisywać wejścia, możesz wywołać swoją funkcję first dla wczytanej wartości i wypisać wynik
  • twoja funkcja first nie zwraca nigdy true

powrót do szkoły podstawowej, aby nauczyć się czytać ze zrozumieniem proste teksty ?

bo nawet tego prostego testu z zadania nie wykonuje poprawnie

Na tak postawione pytanie [+załączony kod] trudno znaleźć rozsądną podpowiedź. Nie wiadomo czy pytający chodzi jeszcze do szkoły podstawowej i czy może przypadskiem nosi okulary [jak ja]. Nie wiadomo, czy pytający, wie, że ma błędnie działający program, i potrzebuje tylko małej pomocy i naprowadzenia, w znalezieniu błędu, czy też nie widzi błędu i uważa, że jego program działa bezbłędnie.

Wygląda, że sugestie, niezadziałały, więc:

  1. “TAK” != “Tak”
  2. “NIE” != “Nie”
  3. Testów może być do 100 000 a nie 10 000 - przeczytaj dokładniej treść zadania.
  4. W funkcji first(…) brakuje na końcu return true - swoją drogą lepszą nazwą funkcji byłoby np: isPrime(…), w języku angielskim, liczby pierwsze, to prime numbers, a nie first numbers


Mniej istotne uwagi:

  1. Staraj się używać zmiennych lokalnych a nie globalnych.
  2. Sprawdzanie czy liczba jest pierwszą, można zakończyć o wiele szybciej, poczytaj o tym.
  3. Dobrze jest używać funkcji, ale ich nadmiar już nie jest dobrym pomysłem.

PS

Też tak kiedyś podpowiadałem, ale okazuje się, że w tym wypadku, najpierw wczytanie całego wejścia od razu do odpowiednio dużej tablicy [bufora], a dopiero potem wykonanie “obliczeń” skutkuje kilkakrotnie szybciej działającym programem - 0.15 vs 0.03 sek. Mam na myśli tylko tą jedną zmianę, bez żadnych innych przyśpieszaczy w rodzaaju wyłączania synchro. Możliwe więc, że warto zrewidować swoje poglądy i za każdym razem sprawdzić, zanim się podpowie :wink:

Ale chyba nie za pomocą strumieni jedna wartość po drugiej? :open_mouth:

Właśnie tak, i to nawet bez wyłączania synchronizacji:

for (int i = 0; i < how_much;  i++)
        cin >> how[i];

Możesz sam sprawdzić i się przekonać (c++14, gcc 6.3). Możliwe, że to [nowy] kompilator tak ostro optymalizuje taką pętlę, nie wiem.

Może bez tak wielkiej różnicy, ale zdarzyły mi się tego rodzaju cudeńka na SPOJu. Nie zwracałem na nie jednak uwagi traktując je jako anomalie w działaniu sędziego.

Nie sądzę, aby należało zrewidować swoje poglądy co do przypadku ogólnego. Swoją drogą - dlatego też nie praktykuję teorii śrubowania czasów na SPOJu :wink: Tablice mogą wydawać się początkującym bardziej intuicyjne, ale w rzeczywistości ich niepotrzebne użycie jest błędem w sztuce i tyle. (Zwykle przypadkowe) poprawienie czasu o ułamek sekundy nie jest żadnym usprawiedliwieniem dla ich użycia, jeżeli nie było to konieczne.

PS http://pl.spoj.com/problems/AL_23_01/1. Zadanie polecam rozwiązać tablicą i kolejką, a następnie porównać rozwiązania pod względem wydajnościowym, złożonością kodu i możliwością zastosowania w praktyce.

Jak super , że wszyscy tutaj od samego początku byli idealni , super umieli czytać, pisać kod i rozwiązywać zadania , strasznie Wam zazdroszczę. Dziękuję za pomoc . Pamiętajcie , że każdy kiedyś zaczynał.

nie rozumiem, poproszę o rozwinięcie tego fragmentu

Przecież @narbej Ci podpowiedział i wskazał na błędy więc o co Ci chodzi?
Poza tym umiejętność zadawania pytań nie zależy od tego czy ktoś zaczyna programować czy jest zawodowym programistą. Jakieś sugestie? Nie jest nawet poprawnym zdaniem pytającym.

oczywiście, że nie potrafili, ale dzięki własnej wytężonej pracy nauczyli się.
słuchanie dobrych rad było dopiero na drugim miejscu, a może i dalej :slight_smile:

programowanie wymaga specyficznych cech charakteru - w szczególności odporności psychicznej :slight_smile:

Miałem kilka rzeczy do roboty a nie chciałem o tym zapomnieć, więc napisałem to w sposób faktycznie niejasny. Już wyjaśniam.

Zadanie zaproponowałem jako luźno związane z tematem “zadania na SPOJu vs rzeczywistość”. Pierwsze rozwiązanie problemu (wzorcówka wg forum algoligii) opiera się na kolejce: przetwarzamy dane na bieżąco, co wymaga więcej myślenia, ale stanowi rozwiązanie, jakie można by zastosować w rzeczywistości. Drugie rozwiązanie to preprocessing - wczytujemy wszystkie dane i w prostszy sposób je analizujemy. W rzeczywistości zastosowanie tego rozwiązania oznacza tyle co otwierać i zamykać bramki na autostradzie dopiero po skończonym weekendzie.

Zadanie przypomniało się mi z kilku powodów. Raz, że zapamiętałem je bardzo dobrze bo mnie zaintrygowało, a kiedy je rozwiązywałem znałem ideę kolejki, ale nie umiałem jej ładnie zastosować w podanym zadaniu. Dwa, że pojawił się temat wczytywania całego wejścia do tablicy - nie wykluczam, że także w przypadku zadania z algoligii wczytanie wejścia przyspiesza działanie programu. No i trzy - zadanie to świetnie pokazuje, że pewne rzeczy, które przejdą na SPOJu (np. nadużywanie tablic), a nawet zagwarantują świetny czas, nie przejdą w rzeczywistym świecie.