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

SPOJ - liczby pierwsze

Object Storage Arubacloud
0 głosów
293 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 (154,780 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 (155,460 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 (40,990 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 (40,990 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 1,600 wizyt
pytanie zadane 6 października 2021 w Python przez Andrzej Hnatiuk Początkujący (350 p.)
+1 głos
2 odpowiedzi 799 wizyt
pytanie zadane 27 października 2019 w Python przez Krystian_nn Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 422 wizyt
pytanie zadane 23 października 2019 w Python przez Krystian_nn Nowicjusz (150 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 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!

...