Konzervatoř P. J. Vejvanovského Kroměříž Predispozice pro výuku IKT (15/16) Základní algoritmy pro počítání s celými a racionálními čísly Adam Šiška 1 Sčítání dvou kladných celých čísel Problém: Jsou dána dvě kladná celá čísla a b v soustavě o základu z, např.: a = 853, b = a z = 10. Máme za úkol nalézt součet čísel c = a + b. Řešení příkladu 853 + : Čísla napíšeme pod sebe zarovnaná zprava (totožné řády číselné soustavy v obou číslech musí být pod sebou). Postupujeme zprava, vezmeme dvě číslice (cifry) zapsané pod sebou a vždy tzv. zkontrolujeme palec (tj. jestli si z předchozího kroku neneseme základ soustavy desítku 1 ). Pokud provádíme první krok palec pochopitelně nedržíme. V našem případě 3 + 3 = 6. Mezivýsledek nepřesahuje základ soustavy 6 < 10, takže pod právě sčítané cifry napíšeme 6 a palec pro příště nedržíme. 853 6 V dalším kroku tedy palec nedržíme, opět sečteme pouze dvě cifry 5 + 8 = 13. Mezivýsledek přesahuje základ soustavy 13 10, takže do příštího kroku držíme palec a pod právě sčítané cifry zapíšeme 13 10 = 3. 1 Pokud sčítáme dvě čísla stačí (binární) palec, ale pokud sčítáme více čísel současně, můžeme z předchozího kroku přenášet i násobky základu soustavy. Nejvíce ale tolik, kolik přičítáme čísel k prvnímu. 1
853 36 (palec) V následujícím kroku poprvé držíme palec, k oběma cifrám tudíž přičítáme ještě jedničku, tj. 8 + 1 + palec = 8 + 1 + 1 = 10. Znovu platí 10 10, proto opět držíme palec a pod aktuální cifry píšeme 10 10 = 0. 853 036 (palec) V zadání už nemáme cifry, které bychom mohli sečíst. Z předchozího kroku ale držíme palec. Píšeme tedy 1 a výpočet je hotový. 853 1036 Obecný postup sčítání: Zadaná čísla a < b v soustavě o základu z mohou obecně vypadat následovně: a = A(n 1)A(n 2)...A(0) a b = B(m 1)B(m 2)...B(0), kde n m je počet cifer jednotlivých čísel. Velká písmena s indexem značí jednotlivé cifry, např. A(2) je počet stovek (tj. 10 2 ) obsažených v čísle a, B(0) počet jednotek (tj. 10 0 ) v čísle b. Je vhodné si uvědomit že libovolná cifra A(i) nebo B(i) je vždy číslo z výčtu 0, 1,..., z 1. Pokud cifra B(i) neexistuje, bereme za její hodnotu nulu: B(i) = 0 2. V algoritmu ještě počítáme s hodnotou P 0, 1, která zaznamenává držení palce. Na začátku výpočtu je P = 0. Následuje algoritmus: i=0 % počítadlo kroků P=0 % palec dokud i <= n opakuj: sečti x = A(i) + B(i) + P pokud je výsledek x větší nebo roven základa soustavy z drž palec P=1 a zapiš C(i) = x - z pokud je výsledek x menší než z zapiš C(i) = x a nedrž palec P=0 i=i+1 % další krok zapiš C(i) = P Výsledek sčítání je číslo c = C(n + 1)C(n)C(n 1)...C ( 1)C(0). S možnou počáteční nulou pokud C(n + 1) 1. 2 To může nastat, pokud je číslo a řádově vyšší než b, tj. obsahuje víc cifer n > m a n i > m 2
2 Odčítání dvou kladných čísel Problém: Jsou dána dvě kladná celá čísla a, b v soustavě o základu z, např.: a =, b = 853 a z = 10. Máme za úkol nalézt rozdíl těchto čísel c = a b. Řešení, které zřejmě vychází z postupu v předchozí části textu a prakticky vyžaduje pouze revizi základního kroku A(i) + B(i) + P, je ponecháno čtenáři. Oba postupy (sčítání a odčítání kladných čísel) lze pochopitelně zobecnit na postup pro sčítání dvou celých čísel. 3 Násobení dvou kladných celých čísel Problém: Jsou dána dvě kladná celá čísla a, b, např.: a = 1024, b = 1024. Máme za úkol nalézt součin těchto čísel c = a b. Řešení příkladu 1024 1024: Násobení čísel pod sebou je založeno na této úvaze: 1024 1024 = 1024 1000 + 1024 + 1024 4. Při výpočtu postupujeme zprava a bereme jednotlivé cifry druhého čísla, kterými vždy vynásobíme celé první číslo. V prvním kroku tedy dostáváme 4 1024 = 4096. V druhém kroku násobíme 1024 = 480, prakticky ale násobíme číslem 2 a poslední nulu mezivýsledku nepíšeme, mezivýsledek ale vhodně zarovnáme. Třetí krok je triviální s mezivýsledkem 0, poslední podobně: pouze opíšeme a vhodně zarovnáme číslo a. Všechna takto zarovnaná čísla nakonec sečteme. 1024. 1024-4096 48 0 1024-1048576 Obecný postup v tomto případě neuvádíme. Algoritmizace tohoto problému už není úplně triviální 3. Je vhodné dodat, že je tento postup nezávislý na volbě číselné soustavy. 3 viz algoritmus v jazyce Pascal zde: odkaz nasobeni.pas 3
4 Dělení dvou kladných celých čísel s desetiným rozvojem Problém: Jsou dána dvě kladná celá čísla a, b, např.: a = 50, b = 6. Máme za úkol nalézt podíl těchto čísel c = a : b vyjádřený jako desetinné číslo (s možným periodickým rozvojem). Řešení příkladu 50 : 6: Základním krokem postupu dělení je určení výsledku dělení se zbytkem. Běžně se ptáme: Kolikrát se 6 vejde do 50? Odpověd je 7-krát, a jelikož 6 7 = 48, do padesáti zbývá 2. Víme tedy, že výsledek bude začínat číslem 7. 50 : 6 = 7-48 zb. 2 Abychom mohli počítat dál je potřeba si uvědomit, že číslo 50 = 50, 00000... a že výsledek například 50000 : 6 se od výsledku 50 : 6 bude lišit pouze umístěním desetinné čárky. K určení další cifry desetiného rozvoje proto počítáme : 6, mezivýsledek už ale píšeme za desetinou čárku. Šestka se do dvaceti vejde 3-krát a zbývá opět 2. 50 : 6 = 7,3-48 -18 2 Je zřejmé, že výpočet se od následujícího kroku bude neustále opakovat (podruhé jsme získali zbytek 2). Výsledné číslo tedy bude mít neukončený periodický rozvoj. 50 : 6 = 7,33-48 -18-18 2 atd... 4
Další příklady: 98 : 8 = 12,25-8 -- 18-16 -16 40-40 0 (zbytek nula znamená konec výpočtu, číslo má ukončený rozvoj) 1 : 7 = 0,142857-0 -- 10-7 -- 30-28 -14 60-56 40-35 50-49 1 (zbytek 1 vyšel i v prvním kroku, proto je číslo nekonečné periodické) 5
5 Sčítání, odčítání, násobení a dělení zlomků Problém: Jsou dána dvě racionáln čísla a b a c d. Máme za úkol nalézt součet, rozdíl, součin a podíl těchto čísel opět vyjádřený zlomkem. Sčítání a odčítání: Násobení a dělení: a b ± c d = a d ± c b b d a b c d = a c b d = a b : d c 6 Počítání s mocninami Problém: Je dáno jedno racionální číslo a b n-tou mocninu čísla a b. a celé číslo n. Máme za úkol nalézt Mocnina: ( a ) n a n = b b n ( a b ) n = b n a n 6