Python - 14. lekce
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

Python - 14. lekcePython - 14. lekce

 

Python - 14. lekce

Google       Google       25. 1. 2006       24 405×

Prvočísla jsou v programování takovým prubířským kamenem. Na vytvoření programu, který bude určovat, jestli zadané číslo je či není prvočíslem, potřebujete znát pár základních příkazů. Čeho ale je potřeba více, je pořádně si to rozmyslet a vymyslet, jak my sami určujeme, jestli číslo je prvočíslem a pokusit tuto metodu převést na program. A o tom je dnešní lekce.

Reklama
Reklama

Prvočísla

Zadání úkolu

Na konci tohoto článku byste měli mít všechny předpoklady pro napsání programu, který bude čekat od uživatele číslo a zjistí, jestli to číslo je či není prvočíslo. Žádnou novou funkci se nenaučíme, je to spíše takové opakování a rozpohybování mozkových závitů.


Teorie

Co je to vůbec prvočíslo? Zkusíme se zeptat pana Googla: Prvočíslo. Hned první odkaz nás zavádí do české Wikipedie, velké studnice znalostí, do které může každý přispívat svou troškou a pomoci tak budovat otevřenou encyklopedii.

Tam se dočítáme:

Prvočíslo je přirozené číslo větší než 1, které je beze zbytku
dělitelné pouze jedničkou a samo sebou.
Jinými slovy třeba pro šestku: šestka není prvočíslo, protože se dá dělit, beze zbytku kromě jedničky a sebe sama také dvojkou a dokonce i trojkou. A číslo 13 zjevně prvočíslo je, protože se, nepočítaje 1 a 13, nedá beze zbytku dělit žádným číslem - ani čísly 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 - při dělení kterýmkoliv z těchto čísel vychází nějaký zbytek. Například 13:7=1 (zbytek 6). Takže teorie je celkem jasná. Teď ale jak to uděláme v programu.

Dnes se toho spoustu dá najít na Internetu. Pokud dostanete udělat program na prvočísla ve škole za úkol a nebude se vám do toho vůbec chtít, celkem lehce najdete na netu řešení. Já jsem vygooglil pro Python jen jedno řešení: hned ten první odkaz. Takže žádná práce. Ale nám jde o to, jestli my sami to dokážeme, jestli na to máme to sami napsat a ne opsat!



Programujte

Jak jsem řekl, nebude zde nic nového, jen chytrolínská kombinace toho, co již známe. Začínat by to mohlo nějak takhle:

print "Urcim, jestli cislo, ktere mi zadate, je prvocislo."
print "Zadej cislo:",
N=input()

A nyní je lépe dvakrát se rozmyslet, jak to budeme dělat. Jak jsme to říkali? Že číslo 13 prvočíslem je?

Vezmeme tedy zadané číslo a budeme procházet všechna čísla, která jsou pod ním (tedy od 2 do N-1) a budeme testovat dělitelnost. Stačí jediný podíl beze zbytku a můžeme skončit, protože je již jasné, že to 'cislo' prvočíslem není.

Pokud projdeme celý cyklus a nenarazíme ani na jediný podíl beze zbytku, tak to bude prvočíslo. Jak ale zajistit programově, abychom to na konci poznali? No uděláme to takovým malým fíglem, který se u podobných příkladů často používá. Na začátku budeme předpokládat, že to prvočíslo je, jinými slovy, zavedeme si proměnnou např. jePrvocislem=True, a pokud uvnitř v cyklu zjistíme první podíl beze zbytku, tak nejenže skončíme, ale nastavíme navíc jePrvocislo=False. No a na konci toto otestujeme podmínkou.


Snad jsem na nic nezapomněl. Je to plně popsaný algoritmus. Snad ještě jen praktická rada, jak v Pythonu zjistit dělitelnost. Dělitelnost je, když výsledek vychází beze zbytku, tedy zbytek=0. No a tady napovídám již více než dost:

>>> 13 % 7
6
>>> 13 / 7
1
>>>


Úkol

  • K čemu jsou vlastně prvočísla dobrá, kde mají praktické využití? (použijte print """zde bude Vaše odpověď""")
  • Určete, jestli zadané číslo je prvočíslem.
  • Použijte funkci, abyste mohli použít tuto formu zápisu, např.:
    # zde bude definice funkce 
    
    print "Urcim, jestli cislo, ktere mi zadate, je prvocislo."
    print "Zadej cislo:",
    N=input()    
    
    print jeToPrvocislo(N)
  • Zefektivněte algoritmus - je třeba prohledávat čísla až do N-1?
  • Dejte pozor na "hraniční hodnoty": 0,1,2.
  • Chcete dostat jedničku? Musíte tedy vymyslet něco svého, něco navíc. Např.
    • Najděte prvních N prvočísel
    • Najděte první N-místné prvočíslo
  • Těším se na všechna řešení

Závěr

Je to stokrát omleté téma, já vím. Obzvláště na středních elektro-školách je toto častou součástí testů a písemek. Přesto (nebo právě proto) je to dost zajímavá úloha, která má tisícero modifikací.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

3 názory  —  3 nové  
Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Pavel KosinaAutor programuje v Pythonu.
Web    

Nové články

Reklama
Reklama
Obrázek ke článku Blockchain & Bitcoin konference

Blockchain & Bitcoin konference

V pátek 19. 5. 2017 se v pražském konferenčním centru Andel’s konala Blockchain & Bitcoin konference. Řada odborníků a podnikatelů v oboru blockchainu a kryptoměn představila možnosti budoucího směřování tohoto oboru. Speakeři většinou rusky mluvící provenience prezentovali řešení svých firem založená na technologii blockchainu.

Obrázek ke článku Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Bezpečnostní tým Cisco Talos odhalil celkem 4 kampaně dosud neobjeveného malwaru, který dostal jméno KONNI. Ten se dokázal úspěšně maskovat od roku 2014. Zpočátku se malware zaměřoval pouze na krádeže citlivých dat. Za 3 roky se ale několikrát vyvinul, přičemž jeho současná verze umožňuje útočníkovi z infikovaného počítače nejenom krást data, ale i mapovat stisky na klávesnici, pořizovat screenshoty obrazovky či v zařízení spustit libovolný kód. Pro odvedení pozornosti oběti zasílali útočníci v příloze také obrázek, zprávu a výhružkách severokorejského režimu či kontakty na členy mezinárodních organizací.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý