Tykkään leikkiä isoilla luvuilla. Kertoma funktiota käsitellessä free Pascalin BigDecimal kirjaston kanssa niihin pääsee käsiksi. BigDecimal: https://www.petke.info/bigdecimalmath.pas
https://www.benibela.de/sources_en.html#bigdecimalmath
Huikeaa:
"Supports at least numbers between 10^-19327352814 to 10^19327352814 with up to 4831838208 decimal digit precision"
Tuo ohjelma on helppo ottaa käyttöön: laittaa vain bigdecimalmath.pas tiedoston samaan hakemistoon, missä kääntää omaa ohjelmaa ja omaan ohjelmaan kirjoittaa:
uses bigdecimalmath;
Kertoma luvusta 200 on:
788657867364790503552363213932185062295135977687
...ettäs tiedätte.
program factorialdiscoveries; uses bigdecimalmath, sysutils; var n: LongInt; k: BigDecimal; str: array [1..3000] of char; function kertoma(luku: LongInt):Bigdecimal; //! var i: LongInt; tulos: BigDecimal; begin tulos:=1; i:=2; while i<=luku do begin tulos:=tulos*i; i:=i+1; end; kertoma:=tulos; end; begin n:=1; while (n<=200) do begin k:=kertoma(n); str:=BigDecimalToStr(k); writeln(n:3,' ', str); n:=n+1; end; end.
BigInteger ja BigDecimal -luokkia on, jos ei nyt kaikille, niin valtaosalle yleisesti käytössä olevista ohjelmointikielistä, monissa vakiona mukanakin.
Eli sinänsä asiassa ei ole mitään kovin ihmeellistä.
Kertomia käsitellessä, jos tarjolla on sekä isot desimaalit että kokonaisluvut, niin kokonaisluvut voisi olla luontevampi valinta. Tässä tapauksessa, kun muistinkulutuksella ja suorituskyvyllä ei ole merkitystä, varmasti kumpi vaan toimii.
Esimerkiksi 8th tukee suoraan big integer ja big float lukuja. Näitä voi myös käyttää samalla tavalla kuin lukuja normaalistikin ilman mitään merkkijonojen kanssa pelailua.
Alla esimerkki mikä tulostaa kertomat välillä 1 - 200:
needs math/factorial : app:main ( n:! I "%d! : %d\n" s:strfmt . ) 1 200 loop ;
Aihe on jo aika vanha, joten et voi enää vastata siihen.