Poslední nenulová číslice faktoriálu

Podobné dokumenty
Zadání: TÉMA: Zápis algoritmu, čtení textového souboru, porovnání řetězců.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Basic256 - úvod do programování Příklady. ing. petr polách

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z

2. lekce Algoritmus, cyklus Miroslav Jílek

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

Programovací jazyk Pascal

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

10 Algoritmizace Příklad 2 Word 2007/ VBA

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Přijímací zkouška na navazující magisterské studium 2017

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

Algoritmizace prostorových úloh

Program a životní cyklus programu

Tematický celek 03 - Cvičné příklady

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Jednoduché cykly

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Úvod do programování 7. hodina

Základy algoritmizace a programování

5. kapitola Spouštění aplikací Visual Basic.Net, spustitelné soubory

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Algoritmizace prostorových úloh

Rozklad na prvočinitele. 3. prosince 2010

VISUAL BASIC. Práce se soubory

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Cvičné příklady Hodina 8 Cvičný 1

VISUAL BASIC. Přehled témat

NPRG030 Programování I RNDr.Tomáš Holan, Ph.D. 4.patro, č

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Počítačová simulace logistických procesů I. 11. přednáška Programování v SimTalk. ŠAVŠ, Fábry

Algoritmizace a programování

Přijímací zkouška na navazující magisterské studium 2015

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Základy algoritmizace

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Algoritmy a datové struktury

Desetinná čísla. pro celá čísla jsme používali typ int. pro desetinná čísla používáme typ double

5 Přehled operátorů, příkazy, přetypování

LEKCE 6. Operátory. V této lekci najdete:

Digitální učební materiál

Úvod do programovacích jazyků (Java)

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

MS Excel Základy maker. Operační program Vzdělávání pro konkurenceschopnost. Projekt Zvyšování IT gramotnosti zaměstnanců vybraných fakult MU

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

NPRG030 Programování I, 2018/19 1 / :25:37

Hromadná změna datumu a času v buňkách

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Visual Basic for Applications

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

Řídicí struktury. alg3 1

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Úvod do programování - Java. Cvičení č.4

Úvod do programovacích jazyků (Java)

KTE / ZPE Informační technologie

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Základy algoritmizace a programování

Závěrečná zkouška z informatiky 2011

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

C# konzole Podíl dvou čísel, podmínka IF

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Makro. PDF vytvořeno zkušební verzí pdffactory Pro

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Variace. Mocniny a odmocniny

Programujeme v softwaru Statistica

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Násobení pomocí sčítání

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

5 Rekurze a zásobník. Rekurzivní volání metody

O datových typech a jejich kontrole

1. Základní pojmy a číselné soustavy

Operátory pro maticové operace (operace s celými maticemi) * násobení maticové Pro čísla platí: 2*2

Operační systémy Linux, Mac OS X a jejich srovnání

Zápis programu v jazyce C#

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Transkript:

Poslední nenulová číslice faktoriálu Kateřina Bambušková BAM015, I206 Abstrakt V tomto článku je popsán a vyřešen problém s určením poslední nenulové číslice faktoriálu přirozeného čísla N. Celý princip spočívá ve vyřešení základních problémů, v navržení vývojového diagramu a jednoduchého algoritmu založeného na iterační metodě výpočtu faktoriálu. Na závěr jsou uvedeny dvě implementace navrženého algoritmu v programovacím jazyce Visual Basic a C. - 1 - Diskrétní Matematika (456-533 DIM) FEI, VŠB-TU Ostrava, 2004

1. Úvod Faktoriál čísla n, značíme jako n s vykřičníkem tj. n! Faktoriál čísla je funkce definovaná jako součin všech čísel od 1 po číslo n nebo lze i součin všech čísel od n do 1, i zde totiž platí komutativní zákon. n! = n (n 1) (n 2) 2 1 = 1 2 (n 2) (n 1) n. 2. Popis problému Při určení poslední nenulové číslice faktoriálu přirozeného čísla narážíme na několik problémů při násobení: 1) při násobní sudých čísel s číslem končícím pětkou nebo součin jakéhokoliv čísla s číslem končícím nulou dochází k nárůstu nul na konci výsledného čísla (například: 2 5 = 10, 35 6 = 210, 123 100 = 12300 atd.) 2) dalším problémem je to, že při násobení velmi rychle dochází k nárůstu řádu výsledných čísel, jelikož řešíme problém pomocí výpočetní techniky a máme k dispozici pouze rozsah 32bitů což je 2 32 = 4,294,967,296 už při čísle 13! což je 6,227,020,800 bychom překročili stanovený rozsah musíme vymyslet řešení, jak tento problém obejít. 3. Řešení problému ad 1) odstranění (pro nás) přebytečných nul je celkem snadné. Koncové nuly můžeme zanedbat a to kdykoliv během výpočtu, protože 0 x = 0 (důkaz viz. skripta: Diskrétní Matematika, 2004, doc. Petr Hliněný, str. 19, Příklad 3.1.) stejně jako abc0 x = abc x0 a počet nul na konci se nemění. Řešení v oblasti výpočetní techniky: jednoduchý algoritmus spočívá v jednoduchém cyklu, kdy stačí číslo vydělit číslem 10 tolikrát, kolik je počet nul na konci čísla. ad 2) co se týče druhého problému, jako řešení lze použít násobení jen části čísla. Konkrétně pak součin nejnižších řádů jednotlivých čísel. Jelikož je našim úkolem zjistit poslední nenulovou číslici, nepotřebujeme vysoké řády čísla. Řešení v oblasti výpočetní techniky: jednoduchý algoritmus spočívá v dělení modulo (zbytek po celočíselném dělení) číslem 10 n kde n je počet platných číslic zprava. Pro naše účely je dostačující 5 platných číslic zprava. Alternativní řešení ve Visual Basicu dovoluje použít funkci Right(), která má dva parametry Right(řetězec, délka) funkce vybere počet číslic zprava určených délkou z řetězce jménem řetězec. Pozn.: přetypování z číselného datového typu na datový typ String probíhá automaticky. - 2 -

4. Vývojový diagram START číslo n n = 0 i = 1 PNčF = 1 i n v = v * i v = v % 10 v % 10 = 0 PNčF = v v = v / 10 v = v % 100000 KONEC 5. Popis algoritmu Podmínka je číslo n = 0? Jestliže ano, pak poslední nenulová číslice faktoriálu (dále jen PNčF) je rovna 1. Konec algoritmu. Jestliže ne, pak: Cyklus od 1 do n. Cykluj tak dlouho dokud je i menší nebo rovno číslu n. Výpočet v = v * i. Součin předchozího výsledku s proměnnou cyklu i. Podmíněný cyklus Jestliže je na konci nula (v modulo 10 = 0), pak tu nulu odstraň v = v / 10 a pokračuj tak dlouho dokud není na konci nenulová číslice, tzn. tak dlouho dokud je na konci nula. Výpočet v = v % 100000. Do výsledku vlož pouze posledních 5 platných číslic. Konec cyklu od 1 do n. Výpočet v = v % 10. Výsledek je roven poslednímu číslu. PNčF = v. Konec algoritmu. - 3 -

6. Implementace Sub Visual Basic() Dim n As Long 'přirozené číslo typu 32bit integer Dim v As Long 'proměnná pro mezivýsledky typu 32bit integer v = 1 'počáteční hodnota If n = 0 Then 'podmínka - v případě, že n = 0 výsledkem je 1 v = 1 Else For i = 1 To n 'cyklus od 1 po hodnotu n v = v * i 'součin mezivýsledku s proměnnou i Do While (v Mod 10 = 0) 'alternativa (Right(v, 1) = 0) 'podmíněný cyklus v = v / 10 'odstraňuje nuly ' * na tomto místě by mohlo být počítadlo nul Loop v = v Mod 100000 'posledních 5 platných číslic 'alternativa v = Right(v, 5) Next i v = v Mod 10 'alternativa v = Right(v, 1) - poslední číslice End If End Sub void main() { //C int n, v; //čísla typu integer v = 1; //počáteční hodnota if (n == 0) //podmínka - v případě, že n = 0 výsledkem je 1 v = 1; else { for (int i = 1; i <= n; i) { //cyklus od 1 do n v = v * i; //součin mezivýsledku s proměnnou i while ((v % 10) == 0) { //podmíněný cyklus v = v / 10; //odstraňuje nuly // * na tomto místě by mohlo být počítadlo nul } //end while v = v % 100000; //posledních 5 platných číslic } //end for v = v % 10; //poslední číslice } //end else } //end void main() - 4 -

7. Závěr Algoritmus je teoreticky navržen pro výpočet hodnot do n = 42 950. Což je 2 32 / 99999. 2 32 32bitové číslo děleno největším možným číslem vyjádřeným 5 platnými číslicemi. Prakticky toto číslo není ověřeno z důvodu velmi dlouhého výpočtu. Nejvyšší mnou ověřená hodnota pomocí programu ve VB je pro n = 7000! kde hodnota PNčF čísla 7000! = 4. V případě, že by nás zajímal počet nul před PNčF, je zřejmé, že nejjednodušší způsob je umístění počítadla v místě *, kde se nuly odstraňují. Výsledky PNčF pro 2004! = 2 a pro 2005! = 6. Několik náhodně vybraných výsledků: 0028! = 8 0558! = 4 1004! = 2 1521! = 2 0031! = 2 0568! = 8 1027! = 2 1534! = 4 0045! = 2 0579! = 8 1049! = 2 1549! = 2 0090! = 2 0579! = 8 1066! = 4 1570! = 6 0091! = 6 0591! = 8 1067! = 2 1580! = 2 0107! = 4 0596! = 4 1086! = 8 1597! = 2 0111! = 2 0601! = 8 1122! = 8 1628! = 8 0112! = 6 0603! = 8 1150! = 2 1649! = 8 0121! = 8 0652! = 6 1159! = 2 1659! = 2 0161! = 2 0706! = 6 1166! = 2 1669! = 2 0195! = 2 0728! = 4 1178! = 4 1725! = 4 0200! = 4 0747! = 4 1184! = 6 1742! = 4 0206! = 6 0757! = 2 1245! = 6 1811! = 6 0212! = 4 0764! = 8 1255! = 2 1821! = 2 0320! = 4 0780! = 2 1263! = 8 1827! = 6 0325! = 8 0802! = 6 1266! = 6 1832! = 4 0372! = 4 0809! = 8 1293! = 2 1838! = 8 0415! = 4 0820! = 8 1295! = 2 1897! = 4 0453! = 6 0825! = 6 1352! = 4 1899! = 6 0487! = 8 0828! = 4 1355! = 4 1923! = 4 0487! = 6 0856! = 8 1388! = 4 1958! = 8 0522! = 2 0860! = 4 1390! = 8 1959! = 8 0527! = 4 0915! = 2 1411! = 2 1960! = 6 0539! = 6 0925! = 2 1418! = 6 1972! = 8 0556! = 6 0937! = 6 1425! = 2 1998! = 4-5 -