Takováhle úloha patří do teorie čísel. Nicméně lze si pomoci. Zaokrouhlíme iracionální číslo na určitý počet desetinných míst. Vztah mezi dělencem a dělitelem je dán samozřejmě jako podíl, ale také je to můžné vyjádřit jako rovnici pomocí MODULO a INTEGER Totiž :
INTEGER
(INT) = Vzorcem =INT(Dělenec;Dělitel) - Basic : INT(Dělenec/dělitel)
MODULO
(MOD) = Vzorcem =MOD(Dělenec;Dělitel) - Basic : Dělenec MOD dělitel
Zlomek obecně potom ve tvaru desetinného čísla odpovídá následujícímu vztahu například :
61,2577724888
- Celočíselná část (červená) odpovídá jak výsledek INTEGER
- Neceločíselná část (modrá) je v relaci s MODULO (Modulo je celočíselný zbytek dělenec - Integer)
Zde se může postup rozvětvit (více možných řešení). Základem je iterace možných dělitelů (D) M(D)[2...(d-1)]..(d)=dělenec.
Takže iterace pomocí vzorce by také přicházela do úvahy spolu s řešitelem. Je otázkou nastavení systémových iterací a iterací potřebných v rozsahu [2...(d-1)]. Ovšem pro relativně malá čísla by to mohlo vyhovovat.
Pokud by to bylo opravdu málo možností (malá celočíselná část), musí se vlastní podíl přiměřeně zvětšovat. Jde li tedy o podíl < 1, je nutno pracovat s jeho převrácenou hodnnotou.
Zde by mohly výrazně pomoci maticové vzorce. Což by byla asi jiná alternativa postupu, nežli s těmi systémovými iteracemi.
Samozřejmě zde přichází nejspíš do úvahy makro, respektive psaná funkce, která se spouští ze sešitu jako vzorec. Tady bych to viděl jako práci s array.
Jen pro orientaci : číslo za zlomkovou čárkou (x) je v relaci s Modulo takto :
"x" = MODULO / dělenec => dělenec = MODULO/(x) - respektive pro lepší představu (celočíselný zbytek po dělení/dělitel).
Potom hledaný celočíselný dělenec (d) a dělitel (D) :
(d) = INT*(i)
(D) = MOD/(i)
Odhad (D) = cca 1/(x) - tedy převrácené hodnotě neceločíselné části. Z toho dostaneme startovní hodnoty pro iterace podílů. jestliže 1/(x) = (y), potom :
Celočíselná část desetinného čísla (A) * (y) = cca hledanému čitateli (Č).
Převrácená hodnota (1/x) = cca jmenovatel (J).
Dle mne nejlepší postup : Vycházáme z toho, že (Č) + (J) = číslo z oboru čísel N. Rozklad tohoto čísla podle Partition Numerorum[PN] určí posloupnost dělenců a dělitelů.
Přibližovat se můžeme jednoduše pomocí inkrementace , nebo dekrementace (Č + J)+/-1. Vlastní hledání pak musí vycházet z toho zda a jak velká je celočíselná část desetinného čísla.
Například třída PN(5,2) vypadá takto :
5 + 0
4 + 1
3 + 2
2 + 3
1 + 4
0 + 5
Je logické, že desetinné číslo < 1 budeme hledat mexi 2/3 a 1/4. Naopak číslo > 1 mezi 4/1 a 3/2. Pakliže je to nevyhovující provedeme iterace na PN(6,2).
Algoritmus je jednoduchý a iterace zpracujeme pomocí array - což umíte. Jen bude asi potřeba někdy zpracovat výpočtovou iteraci + jednu dekremenovanou a také inkrementovanou.
Stejně bychom postupovali při určování přesnosti. Takže bych to viděl na funkci spouštěnou ze sešitu, které dáte dva parametry - vlastní desetinné číslo a údaj vyjadřující přesnost například v procentech ap.
Je zajímavé k čemu by to bylo potřeba - že by třeba k určování dědických podílů nebo jiných majetkových? Ale samozřejmě mimo justiční praxi se příkladů najde přehršel.
Pokud by bylo potřeba vyšších tříd PN, bez pomoci se asi neobejdete. PN(n,2) - druhá třída je snadná "A" jako dělenec a "B" jako dělitel jsou dány "A"[0..n], "B" = n-"A". Respektive hodnoty nulových dělenců a dělitelů jsou nesmyslné a stejně tak dělenců a dělitelů jedničkových. Takže pro
čísla < 1 je to "A"[2..(1/2n)] a čísla > 1 je to "A"[(1/2n)...(n-1)].
Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ