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:około 2 godziny
  • Postów:4896
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:około 2 godziny
  • Postów:4896
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:5 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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)