Problem z zadaniem

Problem z zadaniem
MA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:72
0

Mam napisać program, który wpisze wszystkie podane przez użytkownika liczby oprócz liczb pierwszych występujących nieparzystą ilość razy. Problem w tym, nie wypisuje '1' . Co robię nie tak?

Kopiuj
n = int(input("Wprowadz ilosc liczb: "))
liczby=[]
liczbyKoncowe=[]
liczby_pierwsze=[2]
for i in range (0, n):
    x = int(input("Wprowadz liczbe: "))
    liczby.append(x)
print(liczby)

def czy_pierwsza(liczba):
    for dzielnik in liczby_pierwsze:
        if liczba % dzielnik == 0:
            return False
        if dzielnik * dzielnik > liczba:
            return True
    return True 
for i in range(0, n):
    wystepowanie=liczby.count(liczby[i])
    if ((czy_pierwsza(liczby[i]) is True and wystepowanie%2 == 0) or (czy_pierwsza(liczby[i]) is False)):
        liczbyKoncowe.append(liczby[i])
liczbyKoncowe.remove(2)
print (liczbyKoncowe)

        
edytowany 3x, ostatnio: maxmiks
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:27 minut
  • Postów:4935
0

czy_pierwsza(1) zwraca Ci True.


edytowany 1x, ostatnio: lion137
lion137
@maxmiks: Czyli trzeba to poprawić.
Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
1
Kopiuj
def main():
    [twoj input]
    pierwsze = set(primes_guaz(max(liczby)+1))
    wynik = [i for i in set(liczby) if (liczba in pierwsze and not liczby.count(liczba%2)) or liczba not in pierwsze)
    for liczba in wynik:
        print(liczba, end=", ")
    else: print();

def primes_guaz(n=10**6):
    from itertools import compress
    s = bytearray([1])*(n//2); sqrt_n = int(n**0.5)+1;
    i = 3;
    def mo():
        s[i*i//2::i] = bytearray((n-i*i-1)//(i+i)+1)
    while i<sqrt_n:
        mo() if s[i//2] else 0
        i += 2
    return [2, *compress(range(3,n,2), s[1:])]

if __name__ == "__main__":
    main()```
Możesz od razu wygenerować siatkę pierwszych dla tego co będziesz sprawdzał w programie, ograniczy to setki dzieleń modulo które wykonujesz :)

Linux Mint
Arduino / Python 3.5.2
IT
mógłbyś lekko wyjaśnić działanie tego algorytmu na prime numbers dla newbie? chodzi mi głównie o metodę mo(), chyba że gdzieś jest to rozpisane matematycznie jako czyjeś "twierdzenie", podobne rozwiązania są na stack~, ale średnio to czuję..
Guaz
mo() to funkcja zagnieżdżona w funkcje. Jest to działanie czysto optymalizacyjne, interpreter zapamiętuje linię wewnątrz funkcji, podstawia tylko zmienne. Ogólnie Sito Eratostenesa gdy zbadamy dokładniej, to polega na tym że wykreślanie zaczynamy od potęgi liczby nieparzystej, bo wcześniej nic nie natrafimy, później co drugą wielokrotność, bo pozostałe (parzyste) będą wykreślone już przez dwa. W tym sicie, ignoruję elementy parzyste, więc zaczynam od potęgi liczby //2 żeby pracować na jej fragmencie zamiast całej. Później zastępuje te elementy wartością 0.
Guaz
Zakładając że pracujemy na wszystkich liczbach, musiałoby to wyglądać tak: s[i*i::i+i]. Nie wiem co jest w tym temacie na stack'u bo sam próbowałem to optymalizować gdy profesor zarzucił iż nie ma szybszego algorytmu dla liczb pierwszych, koniec końców, okazało się że ten jest szybszy 50-krotnie :). A ilość pamięci zużywanej (pomimo zwracania listy int'ów) jest wykładniczo mniejsza.
IT
dzięki za odpowiedź. można prosić o githuba? bo widzę prawdziwy pythonista z ciebie :P
Guaz
Nie posiadam żadnego publicznego ani zespołowego projektu w Pythonie, github jest pusty, korzystam z ftp do kopii plików. :P. Ale muszę w końcu go ruszyć kiedyś, by tak nie stał samotnie :)
MA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:72
0

W zasadzie to zrobiłem coś takiego: Wiem, że to trochę "naciągany" program, ale działa ;) Pewnie trzeba go jakoś zoptymalizować

Kopiuj
n = int(input("Wprowadz ilosc liczb: "))
liczby=[]
liczbyKoncowe=[]
liczby_pierwsze=[2]
for i in range (0, n):
    x = int(input("Wprowadz liczbe: "))
    liczby.append(x)
print(liczby)

def czy_pierwsza(liczba):
    for dzielnik in liczby_pierwsze:
        if liczba % dzielnik == 0:
            return False
        if dzielnik * dzielnik > liczba:
            return True
    return True 
for i in range(0, n):
    wystepowanie=liczby.count(liczby[i])
    if ((czy_pierwsza(liczby[i]) is True and wystepowanie%2 == 0) or (czy_pierwsza(liczby[i]) is False)):
        liczbyKoncowe.append(liczby[i])
for i in range (0, n):
    wystepowanie=liczby.count(liczby[i])
    if (liczby[i]==2 and wystepowanie%2 != 0):
        liczbyKoncowe.remove(liczby[i])
    elif liczby[i]==1:
        liczbyKoncowe.append(liczby[i])
print (liczbyKoncowe)

        

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.