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

SPOJ - liczby pierwsze

0 głosów
707 wizyt
pytanie zadane 20 lutego 2023 w Python przez lukaskrol7 Nowicjusz (120 p.)

Cześć, mam następujący problem, otóż w kodzie do zdania SPOJ (PRIME_T):

i = 0
n = int(input())
podana = []
for i in range(n):
    podana1 = int(input())
    podana = podana + [podana1]

i = 0
for i in range(len(podana)):
    
    czyPierwsza(podana[i])

kod funkcja czyPierwsza nic nie zwraca, tylko pisze "TAK" albo "NIE"

gdy wysyła do sprawdzenia to kod przekracza limit czasu,

czy ktoś miałby jakiś pomysł czemu tak się dzieje?

komentarz 20 lutego 2023 przez tangarr Mędrzec (155,140 p.)
Umieściłeś tylko fragment kodu!
komentarz 21 lutego 2023 przez kretiku Nowicjusz (140 p.)

@lukaskrol7, Nie pokazałeś funkcji czyPierwsza i tam pewnie jest problem. Podejrzewam, że sprawdzasz dzielniki w zakresie (2, n) lub (2, n/2), a wystarczy do pierwiastka n (2, int(sqrt(n)) + 1)

 

komentarz 21 lutego 2023 przez mokrowski Mędrzec (158,940 p.)
Dodatkowo (bo algorytm jest najważniejszy)...

W jakim celu wczytujesz dane do listy? Wystarczy wczytać 1 wartość i odpowiedzieć. To także opóźnia obsługę i wpływa na odrzucenie wyniku. Inną sprawą jest także mało wydajna obsługa wczytywania. Dane czytaj z sys.stdin
komentarz 21 lutego 2023 przez lukaskrol7 Nowicjusz (120 p.)

@tangarr, 

nie chciałem wylecieć za wysłanie całego część zapisałem do osobnej funkcji...

def czyPierwsza(liczba):
    dzielniki = 0

    for i in range (liczba-1, 1, -1):
        if liczba%i == 0:
            dzielniki = dzielniki + 1

    if dzielniki == 0 and liczba !=1:
        print("TAK")
    else:
        print("NIE")



i = 0
n = int(input())
podana = []
for i in range(n):
    podana1 = int(input())
    podana = podana + [podana1]

i = 0
for i in range(len(podana)):
    
    czyPierwsza(podana[i])
    

oto cały

1
komentarz 21 lutego 2023 przez reaktywny Nałogowiec (46,230 p.)
Powinieneś kończyć po znalezieniu jednego dzielnika, jak znajdziesz jeden to nie ma sensu szukać kolejnych :)
komentarz 21 lutego 2023 przez lukaskrol7 Nowicjusz (120 p.)
faktycznie, bardzo ci dziękuję
komentarz 21 lutego 2023 przez lukaskrol7 Nowicjusz (120 p.)

@reaktywny, 

import sys


n = int(sys.stdin.readline())               
i = 0
for i in range (n):
    podana = int(sys.stdin.readline()) 
    dzielnik = podana - 1
    if podana == 1:
        print("NIE")
        continue
    elif podana == 2:
        print("TAK")
        continue
    while dzielnik>0:
        
        if podana%dzielnik == 0:
            print("NIE")
            break
        dzielnik = dzielnik - 1
        if dzielnik==1:
            print("TAK")
            break

nadal jednak przekracza czas

komentarz 21 lutego 2023 przez reaktywny Nałogowiec (46,230 p.)
kretiku napisał, że nie musisz sprawdzać wszystkich liczb, z całego zakresu, tylko od 2 do pierw(n)+1.

Masz kilka błędów logicznych w kodzie. Ale więcej się nauczysz, jak je sam poprawisz :)

1 odpowiedź

0 głosów
odpowiedź 21 lutego 2023 przez kretiku Nowicjusz (140 p.)
for i in range(2, int(n ** 0.5) + 1)

n ** 0.5 to to samo co pierwiastek kwardatowy z n

no i jak relatywny napisał wychodzić z pętli po znalizieniu pierwszego dzielnika

Podobne pytania

+1 głos
2 odpowiedzi 2,436 wizyt
pytanie zadane 6 października 2021 w Python przez Andrzej Hnatiuk Początkujący (350 p.)
+1 głos
2 odpowiedzi 998 wizyt
pytanie zadane 27 października 2019 w Python przez Krystian_nn Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 514 wizyt
pytanie zadane 23 października 2019 w Python przez Krystian_nn Nowicjusz (150 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,138 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2658p. - dia-Chann
  2. 2630p. - DziarnowskiJ
  3. 2590p. - Łukasz Piwowar
  4. 2550p. - raydeal
  5. 2529p. - Adrian Wieprzkowicz
  6. 2478p. - rucin93
  7. 2348p. - Łukasz Eckert
  8. 2340p. - CC PL
  9. 2184p. - Maurycy W
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...