papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Des factorielles et encore des factorielles ! Ven 21 Déc 2012 - 19:53 | |
| Salut tout le monde. Hé oui, des factorielles à n’en plus finir ! Tout est expliqué dans le code. Régalez-vous ! - Code:
-
' ****************************************************************************** ' ' N! ' FACTORIELLE N AVEC TOUS SES CHIFFRES ' ' PAR PAPYDALL ' ' ****************************************************************************** ' Ce programme calcule les factorielles(avec tous ses chiffres)de 1 à une limite ' supérieure dependant de la valeur de la variable NMAX. ' Pour des faibles valeurs de NMAX (inférieurs à 100), les calcules sont rapides ' Pour des grandes valeurs de NMAX (supérieurs à 1000), il vaut mieux laisser ' l'ordinateur tourner et allez tondre votre pelouse ou allez au super-marché. ' Et espérez qu'à votre retour, le programme ait bien terminé son job! ' ****************************************************************************** Init() : Demarrer() end ' ****************************************************************************** SUB Init() LABEL erreur dim nmax nmax = 200 : ' Cette variable doit être supérieure à 1 ( minimum = 2) ' Modifier cette valeur : une valeur plus petite accélère les ' calculs mais diminue le nombre de FACTORIELLE . Par exp: ' Pour NMAX = 10, le programme calcule jusqu'à : ' FACTORIELLE 12 qui contient 9 chiffres ' Pour NMAX = 100, le programme calcule jusqu'à : ' FACTORIELLE 69 qui contient 99 chiffres ' Pour NMAX = 200, le programme calcule jusqu'à : ' FACTORIELLE 120 qui contient 199 chiffres ' Pour NMAX = 500, le programme calcule jusqu'à : ' FACTORIELLE 252 qui contient 498 chiffres ' Pour NMAX = 1000, le programme calcule jusqu'à : ' FACTORIELLE 449 qui contient 998 chiffres. ' Pour NMAX = 2000, le programme calcule jusqu'à : ' FACTORIELLE 807 qui comporte 1998 chiffres.
dim a%(nmax),b%(nmax),c%(nmax),c1%(nmax),a$,k,fac$,msg$ full_space 0 : memo 1 : width 1,2000 : height 1,3500 : print_target_is 1 Application_title "FACTORIELLE N AVEC TOUS SES CHIFFRES PAR PAPYDALL" on_error_goto erreur END_SUB ' ****************************************************************************** SUB demarrer() DIM_LOCAL i for i = 2 to nmax : c%(i) = 0 : next i : c%(1) = 1 k = 1 repeat caption 0, "factorielle " + str$(k-1) + " avec tous ses chiffres ! Par PAPYDALL <ESC> pour arrêter" a$ = str$(k) : transforme() for i = 1 to nmax : b%(i) = a%(i) : a%(i) = c%(i) : next i : multiplication() for i = 1 to nmax : a%(i) = c%(i) : next i : affichage() k = k + 1 until scancode = 27 print : print "FACTORIELLE "; k-1 ; " contient " ;len(fac$) ; " Chiffres" END_SUB ' ****************************************************************************** ' Ajoute à C%() le contenu de C1%() SUB addition() DIM_LOCAL r,i,m r = 0 : ' Retenue for i = 1 to nmax m = c1%(i) + c%(i) + r : r = int(m / 10) : c%(i) = m - 10 * r next i END_SUB ' ****************************************************************************** ' Multiplie A%() par B%(), résultat dans C%() SUB multiplication() DIM_LOCAL i,im,i1,j1,r,m for i = 1 to nmax : c%(i) = 0 : next i i = nmax while a%(i) = 0 : if i > 1 then i = i - 1 : end_while im = i for i1 = 1 to nmax if b%(i1) <> 0 for i = 1 to nmax : c1%(i) = 0 : next i r = 0 for j1 = 1 to im + 1 m = a%(j1) * b%(i1) + r : r = int(m / 10) c1%(j1 + i1 - 1) = m - r * 10 next j1 addition() end_if next i1 END_SUB ' ****************************************************************************** ' Transformation de la chaîne de caractères A$ --> Tableau d'entiers A%() SUB transforme() DIM_LOCAL i for i = 1 to nmax : a%(i) = 0 : next i for i = 1 to len(a$) : a%(i) = val(mid$(a$,len(a$) + 1 - i, 1)) : next i END_SUB ' ****************************************************************************** ' Affichage de l'entier long contenu dans A%() SUB affichage() DIM_LOCAL i i = nmax : fac$ = "" while a%(i) = 0 : i = i - 1 : end_while while i <> 0 : fac$ = fac$ + str$(a%(i)) : i = i - 1 : end_while print "FACTORIELLE " + str$(k) + " = " + fac$ END_SUB
' ****************************************************************************** erreur: print : print "FACTORIELLE "; k-1 ; " contient " ;len(fac$) ; " Chiffres" msg$ = " ******** !!! Limite atteinte : FACTORIELLE "+ str$(k-1)+ " avec "+ str$(len(fac$))+" chiffres !!! *******" +chr$(13) msg$ = msg$ + "Pour pousser plus loin cette limite, modifier la valeur de la variable NMAX en ligne 22" message msg$ end ' ******************************************************************************
| |
|