SPOJ- liczby pierwsze

SPOJ- liczby pierwsze
PD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:3
0

Witam, robiłem zadanie na platformie SPOJ, wyniki wychodzą mi poprawnie ale strona uznaje kod za błędny, jakby ktoś mógł zerknąć na kodzik to byłbym bardzo wdzięczny.

https://ideone.com/BPF48P

Kopiuj
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int z;
    string y;
    if (n < 0 || n > 100000)
        return 0;

    for (int i = 0; i < n; i++) {
        cin >> z;
        if (z < 1 || z > 100000)
            return 0;
        if (z == 1) {
            y = "NIE";
        }
        if (z == 2) {
            y = "TAK";
        }

        for (int i = 2; i < z; i++) {
            if (z % i == 0) {
                y = "NIE";

                break;
            }
        }

        cout << y << endl;
    }
    return 0;
}

Link do zadania:
https://pl.spoj.com/problems/PRIME_T/

edytowany 3x, ostatnio: kq
kq
Jak kod jest krótki to wrzucaj bezpośrednio do posta.
Patryk27
Btw, nie musisz dopisywać instrukcji w stylu if(n<0 || n>100000) return 0; - zadania w SPOJu mają zawsze na ogół prawidłowe dane wejściowe, a ich walidacja nie stanowi części polecenia.
kq
Z tym zawsze to bym nie ryzykował, @Patryk27 :​(
Patryk27
@kq: na ogół, chlip :-(
lion137
Wywal tę walidację danych.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
4

Oto Twój program uruchomiony na danych wejściowych widocznych w poleceniu: https://ideone.com/nSWR7X :-)


edytowany 5x, ostatnio: Patryk27
TR
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 3 lata
  • Postów:97
1

Moglbys nadawac zmiennym jakies znaczace nazwy? Ciezko sie to czyta.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4925
2

Test zaczął się od 11, żadna z mozliwości nie zaszła, (do y nie zostało coś przypisane) i program wydrukował pusty string. Ta kombinacja z tym igrekiem budzi moje wątpliwośći, zamknij lepiej test w funkcji zwracającej boola i drukuj "TAK" jak true i "NIE", gdy false.
Pomijając, że program jest mega nieoptymalny, ale w C++, to pewnie przejdzie :)
https://en.wikipedia.org/wiki/Primality_test#Simple_methods


PD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:3
0

https://ideone.com/ABIjF1

A więc lekko go zmodyfikowałem i już działa w tamtych przypadkach, na SPOJ-u nawet przechodzi do etapu uruchamiania sędziego(wcześniej od razu mi błąd wyskakiwał) ale niestety dalej podaje błędny wynik.

Dziękuję za wszelką pomoc !!!
edit :jednak znowu sie jakiś błąd wkradł

https://ideone.com/hPyxVh
ten już działa, ale nie według kompilatora.

edit 2: działa!!! kodzik zaakceptowany przez SPOJ
https://ideone.com/wFDkBr

edytowany 4x, ostatnio: PanusDX
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4925
3

Znów sie bawisz z jakąś zmienną, która wprowadza buga, umiesz napisać funkjcę w C++?
Coś takiego:

Kopiuj
    #include <iostream>
    #include <math.h>
     
    using namespace std;
     bool isPrime(int n) {
       // TODO
     }
    int main()
    {
       int n;
       cin>>n;
       int z;
      
      for(int i=0;i<n;i++)
       {
         cin>>z;
         if (isPrime(z))
            {
              cout << "TAK\n";
            }
          else
          {
            cout << "NIE\n";
          }
       }
           
        return 0;
    }

edytowany 1x, ostatnio: lion137
PD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:3
0
lion137 napisał(a):

Znów sie bawisz z jakąś zmienną, która wprowadza buga, umiesz napisać funkjcę w C++?

Coś takiego:

Kopiuj
    #include <iostream>
    #include <math.h>
     
    using namespace std;
     bool isPrime(int n) {
       // TODO
     }
    int main()
    {
       int n;
       cin>>n;
       int z;
      
      for(int i=0;i<n;i++)
       {
         cin>>z;
         if (isPrime(z))
            {
              cout << "TAK\n";
            }
          else
          {
            cout << "NIE\n";
          }
       }
           
        return 0;
    }
lion137 napisał(a):

Znów sie bawisz z jakąś zmienną, która wprowadza buga, umiesz napisać funkjcę w C++?

Coś takiego:

Kopiuj
    #include <iostream>
    #include <math.h>
     
    using namespace std;
     bool isPrime(int n) {
       // TODO
     }
    int main()
    {
       int n;
       cin>>n;
       int z;
      
      for(int i=0;i<n;i++)
       {
         cin>>z;
         if (isPrime(z))
            {
              cout << "TAK\n";
            }
          else
          {
            cout << "NIE\n";
          }
       }
           
        return 0;
    }

Dzięki, postaram się skorzystać z funkcji przy kolejnych zadaniach aby nie robić takiego bałaganu w kodzie

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:12 minut
3

Polecam poczytać o sicie Eratostenesa.
Jak ktoś ma więcej wiedzy z C++, to można je obliczyć w czasie kompilacji i zadanie rozwiązać na zasadzie "look up table".
Sprawdziłem da się to zrobić na SPOJ i uzyskuje czas 0.01. W sumie zastanawiam się jak inni uzyskali lepszy czas skoro rozwiązanie z constexpr nie ma przestrzeni na usprawnienia.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Zobacz pozostałe 3 komentarze
lion137
od 1 do 100000, to może Miller Rabin? Powienien być, praktycznie w O(1).
MarekR22
@lion137: sito zrobiłem przez constexpr C++14, potem tylko sprawdzam zwartość sita, Miller Rabin nic tu nie poprawi: https://www.godbolt.org/z/3axbf1
enedil
@lion137: właśnie nie, Miller Rabin zaczyna mieć sens przy wyższych wartościach dopiero
lion137
No tak racja, skaluje się.
enedil
Mi się udało uzyskać czas 0.0, i problemem w tym jest szybkość IO. A liczby zamiast przez constexpr sobie po prostu stablicowałem, kod ma 3948 bajtów, gdzie limit jest 50000.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.