Je n'ai pas su trouver la méthode plus rapide pour laquelle 135! est une limite.
Mon algorithme ci-dessous est donc plus lent (7 minutes et 8 secondes pour calculer 135!) mais peut calculer jusqu'à 449! (997 chiffres significatifs).
En virant les zéros de fin de liste et en stockant leur nombre dans une variable, on pourrait étendre la portée de l'algorithme jusqu'à la factorielle qui possède 999 chiffres significatifs avant les zéros, ce qui est assez puissant, quand même. (mais que je n'ai pas fait dans le cadre du concours, c'était inutile... )
prgmFACTDG a écrit::Input N
:getTime→L6
:ClrHome
:Disp "COMPUTING…
:Output(3,1,"*
:abs(iPart(real(N→N
:{1→L1
:For(A,2,N
: Output(2,1,A
: Output(4,1,L1
: AL1→L1
: A-1
: dim(L1)-iPart(Ans/5)-iPart(Ans/25
: For(C,Ans,1,‾1
: If 9<L1(C:Then
: If C=1:Then
: iPart(.1L1(C
: augment({Ans},L1→L1
: IS>(C,C:
: Else
: L1(C-1)+iPart(.1L1(C→L1(C-1
: End
: 10fPart(.1L1(C→L1(C
: End
: End
:End
:DelVar ADelVar CDelVar NClrHome
:Disp "SPENT TIME:","{H,M,S}",getTime-L6,"=
:L1
:DelVar L1Pause Ans
:ClrHome
Bon, en plus de l'algo de base, j'ai ajouté des petits affichages graphiques pour occuper le correcteur, et un calcul du temps d'exécution.
Le programme permet de récupérer la liste contenant les chiffres du résultat dans Ans.
La ligne "dim(L1)-iPart(Ans/5)-iPart(Ans/25" sert à se passer des zéros en fin de liste, les calculer ne sert à rien, alors autant gagner de la vitesse. Une factorielle prend un zéro tout les 5! (à 5!, 10!, 15! ... etc) et un de plus tous les 25! , d'où cette ligne.
Autre remarque, le programme est optimisé pour la vitesse, pas pour le poids en octets, vous l'aurez remarqué
J'aimerais bien connaitre votre méthode, aussi, svp
Dernière édition par persalteas le Jeu 6 Mar 2014 - 19:12, édité 1 fois