Hogyan számoljuk ki a faktoriális, delphisite
<
Faktoriálisának pozitív egész szám definíciója a következő:
n! = N * (n-1) * (n-2) * (n-3) *. * 2 * 1
1! = 1
0! = 1
Példa: 5! = 5 * 4 * 3 * 2 * 1
>
// iteratív megoldása:
funkció FacIterative # 40; N: Szó # 41;. longint;
var
F: LongInt;
i: integer;
kezdődik
f: = 1;
i: = 2 és n do f: = f * i;
Eredmény: = F;
végén;
// rekurzív megoldás:
funkció FacRecursive # 40; N: Szó # 41;. LongInt;
kezdődik
ha n> 1, akkor
Eredmény: = n * FacRecursive # 40; n -1 # 41;
más
Eredmény: = 1;
végén;
Az eljárást találni a pontos érték a faktoriális.
Te valaha is megtalálják a faktoriális 10? - könnyű, de 20 és 100? Még a legfejlettebb számológép, ami nem működik, (mármint a pontos értéket, mint a 100! -158 számokat, hogy mi legyen a kalkulátor kijelzőn megjelenik az értéket.) C-algoritmus tartalmaz egy hasonló programot a leírt, meg lehet csinálni. Egy ilyen program kell egy űrlapot (A nyomtatvány tartalmazó feljegyzés ilyen alkatrészek (név mmOutput eljárás), Maskedit (med), Folyamatsáv (PB-nem szükséges, de ha úgy gondolja, egy nagyon nagy faktoriális, bizonyos időt vesz igénybe, így vizuálisan nyomon követni az idő maradó számítás, ez nagyon kényelmes) ötlet az a program :. változók Delphi nem tartalmazhat ilyen hosszú számokat, így ez használ egy sor integer, feldolgozás, és kap a helyes válasz Ennek eredményeként, akkor feltételezhetjük, faktoriális sok ezer szám, gondoltam 5000.! tekinthető hosszú ideig, de lehetséges.
eljárás TForm1. bbRunClick # 40; Sender: TObject # 41; ; // fogantyú egéreseményeket
var // ez a rész jelzi a változók
eredmény: string; // az eredmény változó típusú egész szám
M: tömb integer;
// „M” - egy olyan mátrix, vagy egy tömb, ami dinamikus, azaz a mérete lehet
F, i, j, k, n: egész szám;
// változik ez növeli a futási a program, de érdekes, hogy megpróbálja
ha med. text = '', akkor
med. szöveg: = '0'; // ingatlan med szöveges elemet ellenőrizzük
n: = StrToInt # 40; állapot # 40; Med. szöveg # 41; # 41; ;
// megadott szám StrToInt-line számkonverzió
exit; // trim-eltávolítás terek egy húr
PB. Max: = # 40; n + sqr # 40; n # 41; # 41; ; // Ez a meghatározás PB méretek
képernyőn. Kurzor: = crHourGlass;
// új kurzor jelenik meg, a standard „vindovsky”
setLength # 40; M, 2 # 41; ; // határozza tömb határait
M # 91; 0 # 93; : = 1; // hozzárendelés 0. elem tömb érték M 1.
i: = 1-től n-do
PB. StepBy # 40; i * 2 # 41; ; // változás jelzések PB
j: = 0 k do
SetLength # 40; M, k + 1 # 41; ;
M # 91; j # 93; : = M # 91; j # 93; * I + F; // itt az alapötlet a program
ha # 40; M # 91; j # 93; div 10 # 41;> 0, akkor
F: = M # 91; j # 93; div 10;
M # 91; j # 93; : = M # 91; j # 93; mod 10;
i: = k downto 0 do // válogató egész értékeket a k 0
ha M # 91; én # 93;> 0, akkor
ha M # 91; én # 93; = 0, akkor
SetLength # 40; M, k # 41; ; // a tömb méretét M az elemek száma-k
j: = k downto 0 do
Eredmény: = Eredmény + IntToStr # 40; M # 91; j # 93; # 41; ;
mmOutput. Vonalak. hozzáad # 40; IntToStr # 40; n # 41; + „! = „+ Eredmény # 41; ;
ha n6. Kockás = igaz, akkor
mmoutput. Vonalak. hozzáad # 40; „Ez a szám” + IntToStr # 40; hossz # 40; eredmény # 41; # 41; + 'Számok. # 41; ;
M: = nil; // felszabadítása IntToStr-line szám konverzió
képernyőn. Kurzor: = crDefault; // kurzor változás
Med. SetFocus művelet; // át a bemenet fókusza alkatrész med