• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PRIME_T - Liczby Pierwsze (SPOJ) w python

Object Storage Arubacloud
+1 głos
1,609 wizyt
pytanie zadane 6 października 2021 w Python przez Andrzej Hnatiuk Początkujący (350 p.)

Zadanie

PRIME_T - Liczby Pierwsze

 

Sprawdź, które spośród danych liczb są liczbami pierwszymi

Input

n - liczba testów n<100000, w kolejnych liniach n liczb z przedziału [1..10000]

Output

Dla każdej liczby słowo TAK, jeśli liczba ta jest pierwsza, słowo: NIE, w przeciwnym wypadku.

Example

Input:
3
11
1
4

Output:
TAK
NIE
NIE

Moje rozwiazanie:

A=int(input())

def czy_pierwsza(A):
    if A == 2:
        return "TAK"
    if A <= 1 or A >= 100000:
        return "NIE"

    for x in range(2, A):
        if A % x == 0:
            return "NIE"
    return "TAK"

print(czy_pierwsza(A))

W mojej głowie wszystko działa i na komputerze tez, a jak wysyłam na SPOJ(python 3) to już nie.

Ktoś wie dlaczego?

2 odpowiedzi

+2 głosów
odpowiedź 7 października 2021 przez VBService Ekspert (253,340 p.)

W treści zadania  jest podane ile testów n ma być wykonane czyli po podaniu liczby n (przez użytkownika), program powinien "pobrać" od użytkownika n liczb, czyli ten zapis z def czy_pierwsza(A):

if A <= 1 or A >= 100000:
        return "NIE"

powinien zniknąć, ponad to (dla przypomnienia wink )

Liczba pierwsza - liczba naturalna większa od 1, ...

zmienił bym zapis

    if A == 2:
        return "TAK"

    na

    if A <= 1:
        return "NIE"

wtedy mamy

def czy_pierwsza(A):
    if A <= 1:
        return "NIE"
 
    for x in range(2, A):
        if A % x == 0:
            return "NIE"
            
    return "TAK"

 

Przykład dla pobrania n testów

print("Podaj liczbę testów [1...100000]")
n = int(input())

if n < 1 or n > 100000:
    print("Podana liczba testów jest nieprawidłowa")
else:
    A = []
    for i in range(n):
        A.append(int(input()))
        
    for i in A:
        print(czy_pierwsza(i))

 

komentarz 7 października 2021 przez adrian17 Ekspert (344,860 p.)

ta pośrednia lista A nic nie dodaje, a komplikuje; można po prostu:

    for i in range(n):
        x = int(input())
        print(czy_pierwsza(x))

 

1
komentarz 7 października 2021 przez Andrzej Hnatiuk Początkujący (350 p.)

@VBService, 

Dzieki wielkie za pomoc, ostatecznie moja wersja wyglada tak:

n = int(input())

def czy_pierwsza(A):
    if A <= 1:
        return "NIE"
    for x in range(2, A):
        if A % x == 0:
            return "NIE"
    return "TAK"

if n > 1 or n < 100000:
    for i in range(n):
        x = int(input())
        print(czy_pierwsza(x))

I dziala

komentarz 7 października 2021 przez VBService Ekspert (253,340 p.)

@adrian17, wzorowałem się na

Output:
TAK
NIE
NIE

ta wersja, którą podałeś daje taki zapis

1
komentarz 7 października 2021 przez adrian17 Ekspert (344,860 p.)

Co nie jest problemem, to jest całkowicie poprawne. Wyjście programu (a nie konsoli) to wciąż tylko

TAK
NIE
TAK

 

komentarz 7 października 2021 przez VBService Ekspert (253,340 p.)

No tak, masz rację, chodzi o output poprawny w tym przypadku TAK / NIE.

komentarz 1 sierpnia 2023 przez mufasa Nowicjusz (100 p.)

@Andrzej Hnatiuk,  

n = int(input())
 
def czy_pierwsza(A):
    if A <= 1:
        return "NIE"
    for x in range(2, A):
        if A % x == 0:
            return "NIE"
    return "TAK"
 
if n > 1 or n < 100000:
    for i in range(n):
        x = int(input())
        print(czy_pierwsza(x))

Hej,

dopiero zaczynam, więc mogę się mylić. Czy ktoś może mi powiedzieć, dlaczego ten program jest akceptowalny przez SPOJ, pomimo że warunki nie są do końca spełnione.

 

 

1.Warunek "n - liczba testów n<100000" rozwiązany jest tak: 

if n > 1 or n < 100000:
    for i in range(n):
        x = int(input())
        print(czy_pierwsza(x))

Dla n mogę podstawić np 200000 i program pozwoli mi na to, gdyż spełnia to jedną stronę or, co nie jest zgodne z wyżej wymienionym warunkiem zadania.

 

 

2. Warunek "w kolejnych liniach n liczb z przedziału [1..10000]" rozwiązany jest tak:

def czy_pierwsza(A):
    if A <= 1:
        return "NIE"
    for x in range(2, A):
        if A % x == 0:
            return "NIE"
    return "TAK"

Tu nawet nie ma wyznaczonej granicy 10000 dla sprawdzanych liczb, co nie jest zgodne z wyżej wymienionym warunkiem zadania.

1
komentarz 1 sierpnia 2023 przez adrian17 Ekspert (344,860 p.)
Nikt nie powiedział że musisz sprawdzać poprawność wejścia w SPOJu. Przeciwnie, możesz _założyć_ że taki będzie zakres danych wejściowych. Tych limitów w ogóle nie musisz w kodzie sprawdzać.
komentarz 1 sierpnia 2023 przez mufasa Nowicjusz (100 p.)
Teraz wszystko jasne, dziękuje
0 głosów
odpowiedź 6 października 2021 przez pionas0407 Gaduła (4,620 p.)
Problem polega na tym, że nie uwzględniłeś n podawanego na początku programu.

Podając np. 7 na początku musisz w każdych kolejnych liniach podać 7 liczb.
komentarz 7 października 2021 przez Andrzej Hnatiuk Początkujący (350 p.)

Podając np. 7 na początku musisz w każdych kolejnych liniach podać 7 liczb.

Nie rozumiem. Chodzi o to ze jak moje A jest 7, to program music sprawdzić od 0 do 7,czy że musi wypisać 7 przykładów? 

Moglbys napisac cos wiecej?

komentarz 7 października 2021 przez pionas0407 Gaduła (4,620 p.)

Kolega @VBService ładnie rozpisał :) Jak masz jeszcze jakieś kłopoty pisz to pomożemy 

Podobne pytania

0 głosów
1 odpowiedź 313 wizyt
pytanie zadane 7 listopada 2021 w Java przez danielxwbt Nowicjusz (150 p.)
+1 głos
1 odpowiedź 494 wizyt
pytanie zadane 19 lipca 2020 w C i C++ przez Arek04 Użytkownik (700 p.)
+1 głos
2 odpowiedzi 799 wizyt
pytanie zadane 27 października 2019 w Python przez Krystian_nn Nowicjusz (150 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...