123 / 277
Nov 2017

Dzięki Mariusz, jeśli chodzi o 100000 to zwiększyłem zasięg zmiennej do 100001, natomiast nie do końca rozumiem dlaczego n ma być od 1 - jest to specjalny przypadek, którego zazwyczaj nie bierze się pod uwagę przy sprawdzaniu liczb pierwszych bo nie jest ona piersza czy chodzi tutaj o stworzenie specjalnego przypadku, że jeśli n = 1 to wypisać na ekran, że liczba nie jest pierwsza? coś jak z 2?

Poprawiłem jeszcze kod i teraz działa poprawnie dla tych danych, które napisałeś.

Potem się pobawię w optymalizację tego bo wiem, że na pewno można to zkrócić, ale póki co chciałbym, żeby to w ogóle zadziałało… Teraz wydaje mi się, że wszystki warunki są uwzględnione. Dla tych danych co mi napisałeś czyli:

5
1
2
3
4
10000

Zwraca poprawbe wyniki czyli:

NIE
TAK
NIE
NIE
NIE

niezupełnie poprawne - mnie uczono, że 3 jest liczbą pierwszą :slight_smile:
zresztą, obecnie za liczbę pierwszą twój program uznaje wyłączne 2

W tym przypadku może to wystarczyć, ale ogólna zasada nakazuje zakładać, że limity w zadaniach są błędnie zaniżane - można dać nawet 200000 i dopiero mając prawidłowy limit schodzić ze stałymi chcąc np wyśrubować czas wykonania.

Oczywiście im nowsze lub bardziej popularne zadanie tym bardziej zgodny z rzeczywistością jest opis, a jedynie kilka zadań to tak zwane perełki więc niniejsze zalecenie jest nieco na wyrost, ale osobiście jestem jego zwolennikiem bo pośrednio ułatwia wiele rzeczy np. debugowanie dla dużych testów albo analizę czasu wykonania.

Wracając do poprzedniego punktu - a jeżeli liczba testów będzie większa to co? Nic nie wyświetlisz? A jeżeli będzie mniejsza to co? Za każdym razem wywołasz ifa wiedząc, że zawsze będzie test < 100000? Po co Ci zatem taka instrukcja?

To samo dotyczy warunku dla n.

1 nie jest liczbą pierwszą i nie wiem dlaczego miałoby się ją pomijać. 2 jest liczbą pierwszą. I tak - program powinien móc podołać tym liczbom, co sugeruje nie tylko treść i test Mariusza, ale też przykładowy output do zadania. Z resztą zostałem uprzedzony :slight_smile:

Zrobiłem jeszcze jedną poprawkę, w zadaniu nie jest jasno napisane co ma się dziać w przypadku przekroczenia zakresu, ale już to dodałem, żeby program się nie zamykał. Nie rozumiem natomiast dlaczego napisałeś, że

`

zresztą, obecnie za liczbę pierwszą twój program uznaje wyłączne 2
`

Sam kod wygląda teraz tak:

I myślisz że sędzia to uzna?

Zacytuję siebie samego:

Te ify działają na trzy sposoby: wydłużają kod, spowalniają program, zwiększają szansę na WA (wystarczy że wyświetlisz taki napis albo tak jak poprzednio - nic nie wyświetlisz zamiast normalnie wykonać program i zwrócić odpowiedź TAK albo NIE).

Matematycznie (wybacz, ale nie chce mi się texem): dla każdej liczby naturalnej n różnej od dwa Twój program uznaje, że nie jest ona pierwsza. Chociażby w Twoich testach:

Faktycznie nawet nie zauważyłem, że zmieniłem w pętli 2 na 1 i każda liczba była złożona (oprócz 2) bo dzieliła się przez jeden, w pierwszej wersji jak wstawiłem to było dobrze, nie wiem po oco to tykałem. Faktycznie niepotrzebie skupiłem się na tych zakresach, ale zrozumiałem, że są one wymagane gdyż było to wyszczególnione w tdanych wejściowych… Powywalałem to i działa, sędzia przyjął. Dzięki bardzo za pomoc… :slight_smile: Czy skasować mój kod powyżej?

Zakresy sa wazne. Dzieki nim wiesz jakich mniej wiecej danych sie spodziewac a zatem jakich zmiennych uzyc. Mozesz tez ocenic jaki algorytm bedzie Ci potrzebny. Ale nie sa one po to by je sprawdzac w kodzie.

Kody prawie AC wiec mozna usunac.

26 days later

Witam, czy mógłby mi ktoś powiedzieć co jest nie tak z moim programem? Odrzuca rozwiązanie, pisząc, że jest błędna odpowiedź.

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n;
    cin >> n;
    int t[n], t1[n];
    for(int i = 0;i < n;i++) {
        cin >> t[i];
    }
    for(int i = 0;i < n;i++) {
        t1[i] = 0;
        for(int j = 2;j <= sqrt(t[i]);j++) {
            if(t[i] % j == 0) t1[i] = 1;
            if(t[i] == 1) t1[i] = 0;
        }
    }
    for(int i = 0;i < n;i++) {
        t1[i] == 1 ? cout << "NIE" << endl : cout << "TAK" << endl;
    }
}

i po raz kolejny muszę pisać:

  1. nie zakładamy nowego wątku, gdy już istnieje wątek poświęcony temu zadania - to zadanie ma wiele wątków, dzięki niefrasobliwości takich jak ty
  2. jeżeli jest wątek, czytamy - z dużym prawdopodobieństwem problem został dawno temu omówiony
  3. wskazane jest przekazywanie kodu poprze ideone.com2 - tam też można przetestować rozwiązanie
  4. oczywiście przed napisaniem na forum warto program przetestować przynajmniej dla danych podanych w zadaniu - twój program daje dla tych danych niepoprawny wynik
1 month later

Nie mam pojęcia już czemu… jakieś podpowiedzi nie liczę na rozwiązanie lecz na dobry kierunek…

– kod usunięto –

Wkleiłeś kod w taki sposób że trudno go analizować, oczywiście post jest w złym miejscu i niezgodnie z regulaminem, ale wg mnie nieprawidłowo definiujesz tablicę dynamiczną.

Faktycznie wrzucilem deklarowanie do maina… dodalem jeszcze do warunku ze a>0 i poszlo . Dziekuje tarpauwatratar:)

Wydaje mi się, że kod działa, jednak nie jest akceptowany. Gdzie leży przyczyna?

`#include

using namespace std;

int main()
{
int n, d;
cin>>d;
for(int j=1; j<=d; j++)
{
while(cin >> n)
{

    if(n==1){
        
        break;
    }
    bool pierwsza = true;
    for(int i=2; i*i<=n; i++)
    {
        if(n%i==0){ 
            pierwsza = false;
        }
    }

if(pierwsza==true){
    cout << "TAK" << endl;
}
else{
    cout << "NIE" << endl;
}
}
}
return 0;

}`

Albo źle przekopiowałeś albo na samym początku nie masz “#include” - nie dodałeś biblioteki chociażby w celu użycia cin/cout. Używaj ideone. Na pierwszy rzut oka widać, że twoja pętla jest źle wykonana. Sprawdź dodatkowo co się stanie jak wprowadzisz 0 albo 1 jako liczbę do sprawdzenia.

Bardzo dziekuje, po dodaniu biblioteki i cout “NIE” dla wartosci <=1 kod zaakceptowany:)

Możesz przyspieszyć program (jeśli używasz cin i cout, a nie scanf i printf) dodając na początku funkcji main() dwie linijki kodu, a mianowicie: cin.tie(NULL);ios_base::sync_with_stdio(0);
Mi się udało w ten sposób zejść z 0.16s do 0.01 :wink:

Jestem tu nowy i niestety napotkałem problem przy pierwszym zadaniu. Niestety nie wiem czemu program mi nie działa. Jeśli ktoś mógł by mi podpowiedzieć co robię nie tak bym był wdzięczny

to może po prostu popatrz na wynik testu podany w zadaniu i na wynik twojego programu
albo jeszcze raz przeczytaj dokładnie treść zadania

z przeprowadzonych testów za każdym razem wyrzuca mi prawidłową odpowiedź dlatego nie wiem czemu nie chce mi przejść