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
hasNonincreasingDigits
- vráti, či cifry čísla tvoria nerastúcu postupnosť. Cifry čísla 44220 tvoria nerastúcu postupnosť, ale čifry čísla 2231 nie (3 je väčšie ako naľavo od neho nachádzajúca sa cifra 2)
containsDigit
- vráti, či zápis čísla n
obsahuje cifru c
gcd
vráti najväčšieho spoločného deliteľa čísel a
a b
(neskôr sa naučíme aj efektívny Euklidov algoritmus)
lcd
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...