or python - małe nieporozumienie

0
from math import sqrt
def liczbapierwsza(od, do):
        lista = []
        for i in range(od, do):
                if (i % 2 or i % 3 or i % 5) == 0:
                        lista.append("nie" + str(i))
                        continue
                for x in range(2,int(sqrt(i)) + 1):
                        if (i % x) == 0:
                                lista.append("nie")
                                break
                else:
                        lista.append("tak" )

        print(lista)
liczbapierwsza(2, 10001)

jak widać gdy liczba jest podzielna przez 2 lub 3 lub 5 - do napisu nie jest dopisywana jaka to jest liczba. Zamiast pokazywać mi przy liczbie np. 10 - nie10 to pokazuje mi tylko nie. A to dlatego, ze liczba nie jest podzielna przez 3 i 5... Powiem tak, do continue wchodzi tylko gdy liczba jest podzielna przez te 3 liczby a ja docelowo chciałbym aby przez obojętnie jaką była a nie 3 jednoczenie... chodzi mi konkretnie o ten fragment

  if (i % 2 or i % 3 or i % 5) == 0:
                        lista.append("nie" + str(i))
                        continue

dla liczby 30 wejdzie a dla 32 nie, mimo że powinno moim zdaniem

0
from math import sqrt
def liczbapierwsza(od, do):
        lista = []
        print("NIE")
        for i in range(od, do):
                if (i > 5) and(i % 2 == 0 or i % 3 == 0 or i % 5 == 0):
                        print("NIE" + str(i))
                        continue
                for x in range(2,int(sqrt(i)) + 1):
                        if (i % x) == 0:
                                print("NIE")
                                break
                else:
                        print("TAK")
 
liczbapierwsza(2, 10001)

dlaczego to nie działa na pl.spoj? różne kombinacje z tą jedynką nawet nie działają :/ ciągle, pokazuje, że błędne rozwiązanie...

0

A może byś podał treść zadania? Może źle wyświetlasz informacje o liczbach pierwszych.

0

http://pl.spoj.com/problems/PRIME_T/
O to zadanie mi chodzi.

0

Jaki jest związek Twojego rozwiązania z zadaniem? Gdzie odczytujesz ilość testów? Gdzie odczytujesz liczby do zbadania? Masz wypisać słowo "TAK" lub "NIE", Ty wypisujesz teksty w rodzaju "NIE94".

0

Jak chodzi ci o http://pl.spoj.com/problems/PRIME_T/, to ja bym zrobił tablicę liczb pierwszych liczoną na zasadzie : jak wszystkie liczby pierwsze mniejsze lub równe od pierwiastka sprawdzanej nie są dzielnikami bez reszty to liczba jest pierwsza i dodaj do tablicy. a potem tylko sprawdzał czy badana liczba tam jest. Prostsze i mniej problematyczne. Aczkolwiek w c++ "przeszło" mi rozwiązanie w którym sprawdzałem czy badana liczba dzieli się bez reszty przez nieparzyste mniejsze od niej, więc limit czasu jest spory. W twoim rozwiązaniu moim zdaniem "przekombinowałeś" tutaj

                for x in range(2,int(sqrt(i)) + 1):
                        if (i % x) == 0:
                                print("NIE")
                                break
                else:
                        print("TAK")

tam powinno być wyjście z funkcji a nie break. wyświetlenie tak "na sztywno" jak wcześniej ani dzieląc przez 2, 3, 5 ani w podanym wyżej fragmencie z niej nie wyjdziesz.

0

Nie rozumiecie. Odpowiedzi mam dobre z tym, ze strona mi ich nie przyjme. Oczywste, jest to, że przy dodawaniu odpowiedzi na stronie nie daje tak str(i) - to było tylko do sprawdzenia czy program zachowuje się poprawnie.

0

Ale tam się liczy dla konkretnych liczb a nie ich przedziałów, czyli nawet argumenty które przyjmuje funkcja masz nie takie (powinien być jeden, liczba do sprawdzenia)

0

Możesz jaśniej? Bo nie rozumiem o co ci chodzi

0

Może podasz dokładnie ten kod, który wysyłasz na spoja?

0
from math import sqrt
def liczbapierwsza(od, do):
        lista = []
#      print("NIE")  # czyli dla 1 będzie NIE. Generalnie to z ty m ibez tego probowałem
        for i in range(od, do):
                if (i > 5) and(i % 2 == 0 or i % 3 == 0 or i % 5 == 0):
                        print("NIE")
                        continue
                for x in range(2,int(sqrt(i)) + 1):
                        if (i % x) == 0:
                                print("NIE")
                                break
                else:
                        print("TAK")
 
liczbapierwsza(2, 10001)


0

@bogdans napisał

Gdzie odczytujesz ilość testów? Gdzie odczytujesz liczby do zbadania?

0
bogdans napisał(a):

@bogdans napisał

Gdzie odczytujesz ilość testów? Gdzie odczytujesz liczby do zbadania?

liczbapierwsza(2, 10001)

tu??

0

Pytania były retoryczne, nigdzie nie odczytujesz.

0

Możesz jakoś jaśniej? Konkretnie o co chodzi bo liczby są wprowadzone do programu

0

Ty nie masz liczyć dla liczb z przedziału [2,10001], tylko dla liczb, które poda spoj.

0

Oj wydaje mi się, że się mylisz

0

ja pierdziele.. nie wierze, dla Ciebie to jest odczytywanie liczb ? a ja chce sprawdzić liczbę, która nie mieści się w Twoim przedziale.. i co ? :)
http://en.wikibooks.org/wiki/Python_Programming/Input_and_output

0

Pozostaje ci zacząć od http://pl.spoj.com/forum/viewtopic.php?f=10&t=1318&sid=919a9a7b0fbc39688d099bba25afcbeb, a dopiero potem pisać program.

0
from math import sqrt
def liczbapierwsza():
        x = 1
        i = int(input())
        if (i > 5) and(i % 2 == 0 or i % 3 == 0 or i % 5 == 0):
                print("NIE")
                x = 2
        if x == 1:
                for y in range(2,int(sqrt(i)) + 1):
                        if (i % y) == 0:
                                print("NIE")
                                break
                else:
                        print("TAK")
 
while True:
        liczbapierwsza()


Teraz przekraczam czas ehh

0

Bo odczytujesz w nieskończoność liczy z wejścia

from math import sqrt
	
def isPrime(n):
    if (n % 2 == 0 or n % 3 == 0 or n % 5 == 0):
        return "NIE"
    for x in range(2,int(sqrt(n)) + 1):
        if (n % x) == 0:
            return "NIE"
    return "TAK"

ile = input()
for i in range(ile):
    k = input()
    print isPrime(k)
0

Twój program źle działa jak cos.

from math import sqrt
def liczbapierwsza(i):
        x = 1
        if (i > 5) and(i % 2 == 0 or i % 3 == 0 or i % 5 == 0):
                return("NIE")
                x = 2
        if x == 1:
                for y in range(2,int(sqrt(i)) + 1):
                        if (i % y) == 0:
                                return("NIE")
                                break
                else:
                        return("TAK")
 
ile = int(input())
for i in range(ile): 
        print(liczbapierwsza(int(input())))

nadal za wolno.

0

@sig -
wejście:
3
6
5
4
7
wyjście:
NIE
TAK
NIE

i juz twój algorytm nie działa dla 5 cyfr -.- co do break - skoro return kończy działanie to break i tak nie jest wykonwywane wiec to nie ma znaczenia, a x usunałem ale posta nie da się edytować.

from math import sqrt
def liczbapierwsza(i):
        if (i > 5) and(i % 2 == 0 or i % 3 == 0 or i % 5 == 0):
                return("NIE")
        else:
                for y in range(2,int(sqrt(i)) + 1):
                        if (i % y) == 0:
                                return("NIE")
                else:
                        return("TAK")
 

for i in range(int(input())): 
        print(liczbapierwsza(int(input())))
0

A else robi się dla pętli a nie ifa

0

Funkcjie po return się nie wykonają - i dobrze o to chodziło, a co to ma do szybkości programu skoro i tak nie są wykonywane?
Co do twojego to moja pomyłka bo umieściłem na początku 3 i nie zauważyłem tego. Nadal czekam na podpowiedz dlaczego mój działa za wolno.

0

Powtarzam. Else jest do pętli a nie do ifa

0

NIE MA czegoś takiego, jak "else do pętli".
Mea culpa - jednak jest (nie wiedziałem o tym ;P) - zwracam honor.

0

może to ?

from math import sqrt

def isPrime(n):
     if n == 1: return "NIE"
     if n > 5 and (n % 2 == 0 or n % 3 == 0 or n % 5 == 0):
         return "NIE"
     z = [x for x in range(2,int(sqrt(n)) + 1) if n % x == 0]
     if not z: return "TAK"
     else: return "NIE"

http://ideone.com/QOI4HG

0

Przyjamniej dowiedzieliście się ode mnie, że istnieje else dla pętli :p To cóz pozostaje czekać na podpowiedzi z pl.spoj (chodzi o post sig)

1 użytkowników online, w tym zalogowanych: 0, gości: 1