Home page

ALD home page

Výuka home page




Faktoriál

(2019)



Napište algoritmus pro výpočet faktoriálu pomocí cyklu a pomocí rekurzivní funkce. Srovnejte jednotlivá řešení.

Poznámka:
Faktoriál je označován „!“. Hodnoty pro testování: 5!=5*4*3*2*1*1= 120 ; 10! = 3628800
(Pro zajímavost 1000! = 4,02387260077093773543702433923e+2567).
Definice funkce faktoriál je:
i ! je pro kladná i roven součinu (i * (i-1) * (i-2) * … 4 * 3 * 2 * 1).
Pro i=0 je i! = 1.

Zároveň je možné faktoriál definovat i jako rekurentní vztah (v definici se objeví tatáž funkce)
i ! je pro kladná i roven (i * (i-1)! )
pro i = 0 je i! = 1.

Úkol:

Založte projekt a v něm soubor mainfaktorial.c kde vypočtěte faktoriál (třemi „způsoby“). Dodržujte přesně požadovaný formát tisku.

0) Ve funkci main načtěte (funkci scanf) dvě celá čísla oddělená čárkou (použijte typ unsigned long long (formátovací řetězec je “%llu“) a int). První celé číslo je hodnota jejíž faktoriál se bude počítat. Druhé číslo bude nula nebo jedna (udává, zda se provede bod číslo 4 zadání). Pro výpočty využívejte typ unsigned long long int. Pokud se nenačtou dva parametry, nebo druhé číslo nebude jedna či nula, vypište text “chybne zadani“ a program ukončete s chybovým kódem 1.
Pokud funkce main skončí bez chyby, vrací hodnotu 0.
1) Napište kód realizující výpočet faktoriálu (nerekurzivní) přímo ve funkci main. Použijte algoritmus, který postupuje od nižších čísel k vyšším. Vytiskněte ve funkci main faktoriál zadaného čísla (z bodu 0). Vytiskněte pouze výsledek (číslo) na začátek řádku a odřádkujte. Výpočet a tisk výsledku proveďte pouze, je-li parametr pro výpočet správně zadán.
2) Napište funkci (se jménem faktnerek) počítající faktoriál (nerekurzivní). Funkce vrací faktoriál čísla zadaného jako parametr. Vypočtěte ve funkci main pro zadané číslo faktoriál zjištěný pomocí této funkce. Vytiskněte výsledek jako v předchozím bodě.
unsigned long long faktnerek(unsigned long long aVal)
3) Napište funkci (se jménem faktrek), počítající faktoriál, výpočet realizovaný rekurzivně. Funkce vrací faktoriál čísla zadaného jako parametr.
unsigned long long faktrek(unsigned long long aVal)

4) Využijte funkci z bodu 3 (vytvořte kopii se jménem faktrektisk) tak, aby při jediném jejím volání vytiskla tato funkce tabulku faktoriálů pro čísla od 0 (nuly) do zvoleného čísla. To znamená, že se bude tisknout při zpětném běhu rekurze.
Ve funkci main tuto funkci zavolejte pouze, mělo-li druhé zadané číslo hodnotu 1 (zadání z bodu 1). Formát tisku je: od začátku řádku je pole desíti znaků, do kterých je vytištěna hodnota čísla, ze kterého se aktuálně počítá faktoriál (zarovnáno na pravý kraj tohoto pole), potom následuje pole třiceti znaků, do kterého se vytiskne faktoriál aktuální hodnoty (zarovnáno na pravý kraj tohoto pole). Každá dvojice (hodnota + výsledek) má vlastní řádek.

5) Jaké je maximální číslo (pro zvolený datový typ) jehož faktoriál se dá pro zvolený datový typ












Poslední změna 2019-02-11