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

SPOJ - liczby pierwsze

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
468 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 (156,320 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 (44,760 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 (44,760 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,010 wizyt
pytanie zadane 6 października 2021 w Python przez Andrzej Hnatiuk Początkujący (350 p.)
+1 głos
2 odpowiedzi 906 wizyt
pytanie zadane 27 października 2019 w Python przez Krystian_nn Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 452 wizyt
pytanie zadane 23 października 2019 w Python przez Krystian_nn Nowicjusz (150 p.)

93,176 zapytań

142,185 odpowiedzi

321,979 komentarzy

62,506 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1637p. - dia-Chann
  2. 1497p. - Łukasz Piwowar
  3. 1372p. - CC PL
  4. 1370p. - Łukasz Eckert
  5. 1351p. - Tomasz Bielak
  6. 1328p. - Michal Drewniak
  7. 1312p. - Łukasz Siedlecki
  8. 1302p. - rucin93
  9. 1273p. - Adrian Wieprzkowicz
  10. 1232p. - Mikbac
  11. 1181p. - rafalszastok
  12. 1169p. - Grzegorz Aleksander Klementowski
  13. 1155p. - Piotr Aleksandrowicz
  14. 1149p. - Michał Telesz
  15. 1127p. - Mariusz Fornal
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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...