Liczby pierwsze od 0 do limitu.

0

Czołem,

Mam na imię Tomek i od pól roku uczę się pythona. Rozwiązuję zadania dla początkujących. Jest zadanko: Write a function that prints all the prime numbers between 0 and limit where limit is a parameter.

Jest rozwiązanie które działa:

Desktop-screenshot.png

Z tym, że nie rozumiem dlaczego poprawnie działa w stosunku do liczby 2! if 2 % 2 == 0 to score =1 (czyli liczba nie jest pierwsza,bo dzieli się bez reszty) A jednak 2 wychodzi w echo poprawnie. Ktoś wyjaśni dlaczego to działa?

pozdrawiam i z góry dziękuję za odpowiedź

def primes(limit):
    prime_numbers = []
    for number in range(2, limit+1):
        score = 0
        for test in range(2, number):
            if number % test == 0:
                score = 1
        if score == 0:
                prime_numbers.append(number)
    print(prime_numbers)
primes(120)
4
  1. Zamieszczaj kod a nie screen bo teraz np. chciałbym sobie to odpalić u siebie a nie mogę skopiować - musiałbym przepisywać.
  2. Do znalezienia przyczyny możesz posłużyć się debuggerem albo printami czyli np. weź sobie primes(2) i w funkcji primes w niektórych liniach wpisz aktualny stan programu (np. zmiennych) pozwoli Ci to zrozumieć co się dzieje krok po kroku
for number in range(2, 5):
    score = 0
    for test in range(2, number):
        print("number: ", number)
        print("test: ", test)
        print("number % test", number % test)
        if number % test == 0:
            score = 1
    if score == 0:
        print("Number: ", number)

Przykładowe printy, które pozwolą Ci znaleźć przyczynę (mógłbym Ci oczywiśćie ją podać ale więcej nauczysz się jesli sam spróbujesz)

4
profWoland napisał(a):

Z tym, że nie rozumiem dlaczego poprawnie działa w stosunku do liczby 2! if 2 % 2 == 0 to score =1 (czyli liczba nie jest pierwsza,bo dzieli się bez reszty) A jednak 2 wychodzi w echo poprawnie. Ktoś wyjaśni dlaczego to działa?

Dlatego że range(2, 2) jest pusty. Nie wchodzi w ogóle do tej pętli wtedy.

Dla przykładu:

> list(range(2,2))

[]
2

Wyszukiwarka: python range explained, np.:
https://www.geeksforgeeks.org/python-range-function/

0

Wewnątrzna pętla miałaby sprawdzać range(2,2) ale zgodnie z dokumentacją range function zakres końcowy jest exclusive czyli to w ogóle nie będzie sprawdzane.
Wynik 2 w echo pojawia się bo nadano wartość score = 0 w zewnętrznej pętli wszystkim liczbom z zakresu (2, limit+1) ale dla liczb (2,2) nie będzie sprawdzany score,czyli liczba 2 ląduje w liście prime_numbers ze standardowym score = 0. To trochę cziterskie rozwiązanie. Dobrze to rozumiem?

1

Tak. Dodatkowo aktualne rozwiązanie wykonuje pętle nawet jeśli już wie, że dana liczba nie jest liczbą pierwszą (co będzie bardzo wolne)

2

można też zrobić sito Eratostenesa np.

n = 100
numbers = list(range(n))
for a in range(2, n // 2):
	for b in range(a * 2, n, a):
		numbers[b] = -1

print([n for n in numbers if n > 1])
0
LukeJL napisał(a):

można też zrobić sito Eratostenesa np.

n = 100
numbers = list(range(n))
for a in range(2, n // 2):
	for b in range(a * 2, n, a):
		numbers[b] = -1

print([n for n in numbers if n > 1])

Jak rozumiem to sito eliminuje wszystkie dzielniki liczb 2,4,5,7,9 itd do limitu. Mógłbyś wyjaśnić jak działa linijka numbers[b] = -1? ustawia index na ostatni od końca?

2
profWoland napisał(a):

Jak rozumiem to sito eliminuje wszystkie dzielniki liczb 2,4,5,7,9 itd do limitu. Mógłbyś wyjaśnić jak działa linijka numbers[b] = -1? ustawia index na ostatni od końca?

Ustawia magiczną liczbę, żeby później móc ją odfiltrować w if n > 1. Równie dobrze można by użyć innej arbitralnej wartości.

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