Cieľom cvičení tretieho týždňa je precvičiť si:
Archetyp: jpaz2-archetype-quickstart
Math
(nájdete ich tak, že do Google zadáte Math Java 8
).
mystery
?
Color
. Koľko parametrov ma použitý konštruktor? Akého typu je premenná c
?
SmartTurtle
pridajte metódu, ktorá nastaví náhodnú farbu kresliaceho pera.
SmartTurtle
pridajte metódu concentricCircles
s parametrom radius
, ktorá nakreslí "nekonečnú" postupnosť vnorených sústredných kruhov. "Nekonečnú" znamená, že útvary, ktoré nie je vidieť, už nekreslíme. Prvý (najväčší) kruh nech má polomer určený parametrom radius
. Každý ďalší (vnorený) kruh, nech má polomer, ktorý je 80% z polomeru toho predošlého. Farby kruhov nech sa postupne cyklicky striedajú: červená, modrá, šedá.
ScientificTurtle
rozširujúcu triedu Turtle
s nasledujúcimi metódami:
min
vráti menšie z čísel cislo1
a cislo2
power
vypočíta nk
factorial
vypočíta n!
countDivisors
vráti počet prirodzených deliteľov čísla n
isPrime
vráti, či je číslo n
prvočíslom
countDigits
vráti počet cifier čísla n
containsDigit
- vráti, či zápis čísla n
obsahuje cifru c
hasNonincreasingDigits
- vráti, či cifry čísla tvoria nerastúcu postupnosť. Cifry čísla 44220 tvoria nerastúcu postupnosť, ale cifry čísla 2231 nie (3 je väčšie ako naľavo od neho nachádzajúca sa cifra 2)
gcd
vráti najväčšieho spoločného deliteľa čísel a
a b
(neskôr sa naučíme aj efektívny Euklidov algoritmus)
lcm
vráti najmenší spoločný násobok čísel a
a b
SmartTurtle
metódu snooker
, ktorá bude realizovať nasledovný algoritmus:
this.setRangeStyle(RangeStyle.BOUNCE);
nastaví, aby sa odrážala od hranice kresliaceho plátna
<20, 280)
(predpokladáme štandardnú kresliacu plochu s rozmermi 300 x 300
).
JPAZUtilities.delay(50)
)
ScientificTurtle
pridajte metódu findGreatestDigit
, ktorá vráti najväčšiu cifru v zadanom čísle.
ScientificTurtle
), ktorá pre zadané číslo vráti minimálny počet operácii, ktoré musíme vykonať, aby sme na displeji zobrazili parametrom zadané číslo n
.
Math.pow
je užitočná metóda na vyrátanie mocniny čísla s desatinnou čiarkou. Konkrétne Math.pow(a, b)
vráti ab
. Všimnime si však jej hlavičku:
Keďže exponent je typu double
, túto metódu môžeme použiť aj na vypočítanie neceločíselných mocnín. Príklad: Math.pow(3.5, 0.25)
vypočíta štvrtú odmocninu z čísla 3.5
.
To, že táto metóda pracuje s číslami s desatinnou čiarkou, je tak jej silnou stránkou, ale pri nevhodnom použití aj slabou stránkou. Totiž čísla s desatinnou čiarkou majú limitovanú presnosť.
Príkladom nevhodného použitia tejto metódy je počítanie celých mocnín celých čísel. Vyskúšajte tento kód (napr. v metóde main
triedy Launcher
):
Na doplnenie: 1315 = 51185893014090757
, čo je menej ako maximálna hodnota pre long
9223372036854775807
, t.j. nedôjde tu k pretečeniu (a rozdielnosť hodnôt tak nie je zapríčinená pretečením pri násobení ale limitovanou presnosťou hodnôt typu double
).
Cieľom jednej z úloh bolo pre zadané kladné nenulové číslo n
určiť počet jeho deliteľov. Na prednáške bol prezentovaný jednoduchý algoritmus založený na testovaní všetkých celých čísel od 1
po n
. Zároveň na prednáške bolo naznačené, že si vystačíme aj s testovaním menšieho počtu čísel - konkrétne √n
čísel. Ako však na to?
Uvažujme číslo n
. Nech a
je nejakým deliteľom čísla n
. Potom musí existovať také celé číslo b
, že n = a.b
. Teda číslo b
je taktiež deliteľom čísla n
. Na tieto 2 delitele čísla n
môžeme pozerať ako na akési "kamarátske" delitele čísla n
. Bez ujmy na všeobecnosti nech a <= b
. Ak a
nie je √n
, potom platí, že a < √n
a b > √n
(dôkaz sporom - ak by a < √n
a b < √n
, potom a.b < √n.√n = n
, čo je v spore, že a.b = n
; analogicky možno dokázať, že nenastane a > √n
a b > √n
). Dôsledkom tohto pozorovania je to, že ku každému deliteľovi ostro menšiemu ako √n
prislúcha jeden deliteľ ostro väčší ako √n
a naopak.
Zvyšok je už len programátorčina...