Liceum Klasa I 45 minut PP: II.1 + I.2a | s. 342-343

Lekcja 12: Programowanie algorytmow na liczbach - pierwszosc, systemy

Implementacja testu pierwszosci i konwersji systemow liczbowych w Pythonie

📋 Podstawa programowa: II.1+I.2a
Pythonalgorytmydzielnikiimplementacjakonwersjamodulopierwszosc liczbyprogramowaniesystemy liczbowe
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Badanie pierwszosci liczby

Liczba pierwsza to liczba naturalna wieksza od 1, ktora ma dokladnie dwa dzielniki: 1 i samej siebie. Przyklady: 2, 3, 5, 7, 11, 13, 17, 19, 23...

Aby sprawdzic, czy liczba n jest pierwsza, musimy sprawdzic, czy nie dzieli sie przez zadna liczbe od 2 do pierwiastka z n. Dlaczego wystarczy sprawdzac do pierwiastka? Jezeli n = a * b, to przynajmniej jeden z czynnikow a lub b musi byc mniejszy lub rowny pierwiastkowi z n.

Optymalizacja: Nie musimy sprawdzac dzielnikow az do n-1. Wystarczy sprawdzic do sqrt(n), co znacznie przyspiesza algorytm. Dla n = 1000000 zamiast sprawdzac 999999 dzielnikow, sprawdzamy tylko 1000!
# Algorytm badania pierwszosci - wersja podstawowa
def czy_pierwsza(n):
    if n < 2:
        return False
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

# Wersja zoptymalizowana - sprawdzanie do sqrt(n)
import math

def czy_pierwsza_opt(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

# Test
liczba = int(input("Podaj liczbe: "))
if czy_pierwsza_opt(liczba):
    print(f"{liczba} jest liczba pierwsza")
else:
    print(f"{liczba} NIE jest liczba pierwsza")

Konwersja systemow liczbowych w Pythonie

Na poprzednich lekcjach poznalismy systemy liczbowe (DEC, BIN, OCT, HEX). Teraz napiszemy wlasne programy realizujace konwersje miedzy nimi. Skupimy sie na konwersji z systemu dziesietnego na dwojkowy.

Algorytm konwersji DEC na BIN: Dzielimy liczbe przez 2 i zapisujemy reszty z dzielenia. Nastepnie odczytujemy reszty od konca - to jest nasz wynik w systemie dwojkowym.

# Konwersja DEC na BIN - wlasna implementacja
def dec_na_bin(n):
    if n == 0:
        return "0"
    wynik = ""
    while n > 0:
        reszta = n % 2
        wynik = str(reszta) + wynik
        n = n // 2
    return wynik

# Test
liczba = int(input("Podaj liczbe dziesietna: "))
print(f"{liczba} w systemie binarnym to: {dec_na_bin(liczba)}")
print(f"Sprawdzenie (wbudowana): {bin(liczba)}")

Python posiada rowniez wbudowane funkcje do konwersji:

  • bin(n) - konwersja na system binarny (z przedrostkiem 0b)
  • oct(n) - konwersja na system osemkowy (z przedrostkiem 0o)
  • hex(n) - konwersja na system szesnastkowy (z przedrostkiem 0x)
  • int("101", 2) - konwersja z dowolnego systemu na dziesietny
# Wbudowane funkcje konwersji
n = 42
print(f"DEC: {n}")
print(f"BIN: {bin(n)}")       # 0b101010
print(f"OCT: {oct(n)}")       # 0o52
print(f"HEX: {hex(n)}")       # 0x2a

# Konwersja z BIN na DEC
print(int("101010", 2))   # 42
✏️

Zadania

Latwe

Zadanie 1: Test pierwszosci

Napisz program, ktory wczytuje liczbe od uzytkownika i sprawdza, czy jest ona pierwsza. Wyswietl odpowiedni komunikat.

Pokaz rozwiazanie
import math

n = int(input("Podaj liczbe: "))

if n < 2:
    print("To nie jest liczba pierwsza")
else:
    pierwsza = True
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            pierwsza = False
            break
    if pierwsza:
        print(f"{n} jest liczba pierwsza")
    else:
        print(f"{n} NIE jest liczba pierwsza")
Srednie

Zadanie 2: Liczby pierwsze w zakresie

Napisz program, ktory wypisuje wszystkie liczby pierwsze z zakresu od 2 do n (n podane przez uzytkownika).

Pokaz rozwiazanie
import math

def czy_pierwsza(n):
    if n < 2:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

n = int(input("Podaj gorny zakres: "))
print(f"Liczby pierwsze od 2 do {n}:")
for i in range(2, n + 1):
    if czy_pierwsza(i):
        print(i, end=" ")
Srednie

Zadanie 3: Konwerter DEC na BIN

Napisz program, ktory konwertuje liczbe z systemu dziesietnego na binarny BEZ uzycia wbudowanej funkcji bin(). Uzyj algorytmu dzielenia przez 2.

Pokaz rozwiazanie
n = int(input("Podaj liczbe dziesietna: "))

if n == 0:
    print("Wynik binarny: 0")
else:
    wynik = ""
    temp = n
    while temp > 0:
        wynik = str(temp % 2) + wynik
        temp = temp // 2
    print(f"{n} (DEC) = {wynik} (BIN)")
    print(f"Sprawdzenie: {bin(n)}")
Trudne

Zadanie 4: Uniwersalny konwerter systemow

Napisz program, ktory konwertuje liczbe z dowolnego systemu (2-16) na dowolny inny system. Uzyj wbudowanych funkcji Pythona int() i odpowiedniego algorytmu.

Pokaz rozwiazanie
def konwertuj(liczba_str, baza_z, baza_na):
    # Konwersja na system dziesietny
    dec = int(liczba_str, baza_z)

    # Konwersja z dziesietnego na docelowy
    if dec == 0:
        return "0"

    cyfry = "0123456789ABCDEF"
    wynik = ""
    while dec > 0:
        wynik = cyfry[dec % baza_na] + wynik
        dec = dec // baza_na
    return wynik

liczba = input("Podaj liczbe: ")
z = int(input("System zrodlowy (2-16): "))
na = int(input("System docelowy (2-16): "))
print(f"Wynik: {konwertuj(liczba, z, na)}")
🎥

Materialy wideo

Algorytm znajdywania liczb pierwszych( część I)
Paweł Malarczyk
Integer Representations and Algorithms
Stu Math Time
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 11: Petle for, while Lekcja 13: Funkcje →