kombinační číslo
Chceme spočítat kombinační číslo, které může být velké. To znamená, že ho nelze reprezentovat pomocí předdefinovaných celočíselných datových typů (integer, longword). Například 1000 nad 10 má 24 číslic a to už se nám do integeru nevejde. Je to číslo srovnatelné například s počtem zrnek písku na zemi.
Pro výpočet využijeme toho, že každé kombinační číslo lze zkrátit na součin maximálně k-čísel. Získáme ho tak, že postupně zkrátíme všechny činitele ve jmenovateli posledního zlomku výše s něčím ze jmenovatele. Určitě to půjde, protože o kombinačních číslech se ví, že jsou celá.
Budeme tedy potřebovat:
- 1) proceduru/funkci, která umí zkrátit zlomek (dva seznamy integerů - činitelé v čitateli a ve jmenovateli)
- 2) vlastní typ pro reprezentaci dlouhých čísel (např. pole, ve kterém každý prvek představuje jednu cifru)
- 3) proceduru/funkci, která dokáže násobit dlouhé číslo integerem
Poté, co zkrátíme zlomek, stačí nám vyrobit si číslo 1 reprezentované jako dlouhé a realizovat součin, který zbyl po zkrácení zlomku.
faktorová množina
Mějme seznam dvojic lidí, kteří se narodili ve stejný den.
Chceme na základě tohoto seznamu zjistit a vypsat skupiny lidí, kteří budou
slavit svoje narozeniny společně. Počet lidí je shora omezen rozumnou konstantou (třeba RK=10000
).
Jeden z možných způsobů využívá pole indexované čísly(písmeny) lidí. Na začátku dáme každému jeho vlastní skupinu a jak se postupně dozvídáme "kdo s kým", tak přepisujeme skupiny. V takovém poli potom nakonec budou mít lidé, kteří se narodili ve stejný den stejné číslo.
Tato reprezentace může vyžadovat trochu přemýšlení nad způsobem výpisu výsledných množin.
Pokud rozumíte tomu, kde se během tohoto přístupu zbytečně plýtvá procesorovým časem, neváhejte a vymyslete si lepší způsob.
Zápočtový test
Přikládám zde ke stažení archiv řešených testových úloh. Archiv obsahuje zdrojové kódy, které vytvořili vaši předchůdci. Nejsem autorem těchto kódů a neručím za jejich kvalitu a správnost.
Užijete-li je moudře poslouží vám. Nechť vás provází Síla.