| |
|
|
p.specht
| Hier eine langsamere Variante, bei der aber die Nummernbasis geändert werden könnte (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.
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 27.05.2021 ▲ |
|
|
|