Italia
Fonte/ Codesnippets

Größere Faktorielle berechnen

 

p.specht

Hier eine langsamere Variante, bei der aber die Nummernbasis geändert werden potuto (Das ist in Cryptosystemen manchmal gefragt):
WindowTitle "Größere Faktorielle berechnen"
'(CL) CopyLeft 2014-09 by P.Specht, Wien; Keine wie auch immer geartete Gewähr!
'Orig.-Source aus https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic
Window 0,0-%maxx,%maxy
font 2
var Limit& = 10000' Sufficient digits.
var Base&  = 10' The base of the simulated arithmetic.
var FactorialLimit& = 365' Default of Target number to solve, 365!
Declare digit&[Limit&]' 1..Limit&: The big number.
declare carry&,d&' Assistants during multiplication.
declare last&,i&,n&' Indices to the big number's digits.
declare text$,c$' Scratchpad for output and for input
declare tdigit$[] : tdigit$[]=explode("0 1 2 3 4 5 6 7 8 9"," ")
BEGIN:
Print "\n Zahl, von der die Faktorielle errechnet werden soll: ? ";:Input c$
case val(c$)>0:FactorialLimit&=val(c$)
digit&[]=0' Clear the whole array.
digit&[1]=1' The big number starts with 1,
last&=1' Its highest-order digit is number 1.

whileloop FactorialLimit&

    n&=&Loop' Step through producing 1!, 2!, 3!, 4!, etc.
    carry&=0' Start a multiply by n.

    whileloop last&:i&=&Loop' Step along every digit.

        d&=digit&[i&]*n&+carry&' The classic multiply.
        digit&[i&]=(d& mod Base&)' The low-order digit of the result.
        carry&=d& \ Base&' The carry to the next digit.

    endwhile

    while carry& > 0' Store the carry in the big number.

        if last&>=Limit&

            print "Overflow!";' If possible!
            beep: waitinput :end

        endif

        last&=last& + 1' One more digit.
        digit&[last&]=carry& mod Base&' Placed.
        carry&=carry& \ Base&' The carry reduced.

    endwhile' With n > Base, maybe > 1 digit extra.

    case rnd()<0.1:print "*";
    ' Print n&;"! = ";text$+" ("+str$(len(text$)-1)+" Stellen)"  ' Print the result!

endwhile' On to the next factorial up.

text$=" "' Now prepare the output.

whileloop last&:i&=&Loop' Translate from binary to text.

    text$=tdigit$[digit&[i&]]+text$' Reverse the order.

endwhile' Arabic numerals put the low order last.

cls
Print "\n "+str$(n&)+" ! = ";text$+" ("+str$(len(text$))+" Stellen)"
clearclip:putclip str$(n&)+" ! = "+text$+"\n"
print "\n Last result in clipboard! "
sound 300,300 : waitinput
END
 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
15.05.2021  
 




p.specht

Faktorielle bis Facf(100000)
========================
XProfan mit Floats kann das eigentlich nur bis 170. Der Overflow-Error wird hier aber abgefangen, das Ergebnis per Minuszeichen gekennzeichnet und via Zehnerlogarithmus errechnet. Bei der Ausgabe wird das Minus dann entsprechend interpretiert, die Stellenzahl der Mantisse ist dann aber nur auf etwa 12 signifikante Kommastellen gültig.
Proc Facf :parameters N&:casenot N&:return 1.0

    if N&>100000:print " *** FAC() TOO BIG! *** ";:beep:return -100000:endif

        if N&<171:var p!=1:whileloop N&:p!=p!*&Loop:endwhile:return p!

            else :var s!=0:whileloop N&:s!=s!-lg(&Loop):endwhile:return s!:endif

        EndProc

        Declare N!,F!

        Repeat

            print " N = ";:input N!:F!=Facf(N!)
            print " Facf(";int(N!);") = ";

            if F!>=0:print format$(" %g",F!)

                else :set("decimals",17)
                print str$( round(10^(int(F!)-F!),13))+"e+"+str$(int(-F!) )

            endif

        Until 0

 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
27.05.2021  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

1.707 Views

Untitledvor 0 min.
Erhard Wirth14.06.2024
p.specht21.11.2021
R.Schneider20.11.2021
Uwe Lang20.11.2021
Di più...

Themeninformationen

Dieses Thema hat 1 subscriber:

p.specht (2x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie