begin process at 2012 05 27 14:03:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CALCUL DU FACTORIEL DES GRANDS NOMBRES EN TOUTE RAPIDITÉ

CALCUL DU FACTORIEL DES GRANDS NOMBRES EN TOUTE RAPIDITÉ




 Description

Cliquez pour voir la capture en taille normale
bonsoir(c'est le soir pour le moment d'ecriture de ces mots!)
mon code permet de calculer le factoriel des grands nombres <= 1000
j'utilise les chaines de caractères pour définir les nombres comme étant des suites de caractères numériques
et je définit les relations arithmetique comme on l'a appris aux écoles primaires!!
ensuite je genere un tableau de chaines de caracteres pour calculer les résultats une fois pour toute
j'ai pris comme max 2600 car le nombre de chiffre de 1000! ne dépasse pas cette valeur
...

Source

  • #include <stdio.h>
  • #include<string.h>
  • #define MAX 2600
  • char f[1001][MAX]={"1"};
  • char n[MAX]="1";
  • void multiply(int k){
  • char tampon[MAX];
  • int l=strlen(n);
  • for(int i=0;i<l;i++)
  • tampon[i]=n[l-i-1];
  • tampon[l]=0;
  • int rest=0;
  • int i;
  • for( i=0;i<l;i++)
  • {int x=k*(tampon[i]-'0')+rest;
  • rest=x/10;
  • tampon[i]=x%10+'0';
  • }
  • while(rest!=0)
  • {tampon[i++]=rest%10+'0';
  • rest/=10;
  • }
  • tampon[i]=0;
  • int L=strlen(tampon);
  • for(i=0;i<L;i++) n[i]=tampon[L-i-1];
  • n[L]=0;
  • }
  • int main(){
  • int k;
  • for(int i=1;i<=1000;i++){
  • multiply(i);
  • strcpy(f[i],n);
  • }
  • while(1){
  • printf("entrer le nombre que vous vouler savoir son factoriel (0 pour sortir du choix):\n");
  • scanf("%d",&k);
  • if(k == 0) break;
  • printf("%d!\n",k);
  • puts(f[k]);
  • }
  • return 0;
  • }
#include <stdio.h>
#include<string.h>
#define MAX 2600
char f[1001][MAX]={"1"};
char n[MAX]="1";
void multiply(int k){
     char tampon[MAX];
     int l=strlen(n);
     for(int i=0;i<l;i++)
      tampon[i]=n[l-i-1];
      tampon[l]=0;
      int rest=0;
      int i;
      for( i=0;i<l;i++)
      {int x=k*(tampon[i]-'0')+rest;
      rest=x/10;
      tampon[i]=x%10+'0';
      }
      while(rest!=0)
        {tampon[i++]=rest%10+'0';
        rest/=10;
        }
     tampon[i]=0;
     int L=strlen(tampon);
     for(i=0;i<L;i++) n[i]=tampon[L-i-1];
     n[L]=0;
     
     }
     int main(){
         int k;        
         for(int i=1;i<=1000;i++){
          multiply(i);
          strcpy(f[i],n);       
                 
         }
         
         while(1){
          printf("entrer le nombre que vous vouler savoir son factoriel (0 pour sortir du choix):\n");
          scanf("%d",&k);
          if(k == 0) break;
          printf("%d!\n",k);
          puts(f[k]);
          }
          
          return 0;
         }

 Conclusion

donc je vais paramétrer encore le code pour qu'il soit utile pour toute rangée des entiers!


 Sources du même auteur

Source avec Zip Source avec une capture CLASS MATRICE C++
MEILLEURE MÉTHODE POUR CALCULER UN PUISSANCE
Source avec Zip Source avec une capture OBTENIR TOUTES LES NOMBRES PREMIERS DANS UNE GRANDE RANGÉE A...
Source avec une capture EVALUATION D'UNE EXPRESSION PARENTHÉSÉE
JOUR A PARTIR D'UNE DATE MM/JJ/YYYY

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de elkasimi2007 le 17/04/2007 17:42:57

salut pour le code proposé le temps d'execution pour la liste omplète des nombres
1 ... 1000 est de 24 secondes alors que c'est seulement 264 ms pour l'autre ;)
ta proposition sert principalement a optimiser la memoire du programme mais mon objectif est le calcul rapide des solutions.
a bientot

Commentaire de pgl10 le 17/04/2007 20:20:44

Effectivement tout dépend de ce que l'on veut faire. Avec la variante qui n'a pas besoin du tableau f on peut, si nécessaire,  imprimer chaque factoriel successif dans la boucle : for ... multiply(i);
De plus avec cette variante on peut calculer !20000 il suffit de mettre : #define MAX 78000  Cela ne pose aucun problème.
Mais avec le tableau f cela fait : 1 560 000 000 octets.

Commentaire de BruNews le 18/04/2007 00:33:08 administrateur CS

Suffit d'un malloc() pour régler le prob de taille.

Commentaire de pgl10 le 18/04/2007 09:58:28

Pour clarifier mon commentaire précédant, je précise que grâce à la routine multiply() ici présente de ELKASIMI2007 j'ai calculé facilement 20000! avec la variante sans le tableau f comme je l'ai indiqué. Par contre, malloc ou pas, je n'ai pas osé utiliser un tableau ayant la taille de 1 560 000 000 octets, cela fait quand même beaucoup. Enfin, 20000! qui se calcule en une minute environ et qui s'écrit avec 77338 chiffres doit être facile à dépasser. Mais si on utilise f il faut augmenter sa taille environ au carré du rapport d'augmentation du nombre dont on cherche le factoriel. En résumé, bravo pour cette incursion inhabituelle dans les très grands nombres.

Commentaire de elkasimi2007 le 18/04/2007 15:23:40

salut,je précise que mon code sert pour une réponse aléatoire des nombres entre 1 et 1000
et non juste l'affichage des factoriels entre 1 et 1000

Commentaire de Cyberboy2054 le 18/04/2007 19:43:38

Je suis impression par l'efficacité de ton programme, alors que la source fait à peine 50 lignes !

Commentaire de coucou747 le 19/04/2007 02:46:11 administrateur CS

ce qui est interessant c'est de bosser sur une base superieure pour diminuer le nombre d'operations et le nombre de retenues, mais apres, on ne peut plus faire int a ... if a > MAXINT... gerer retenue... on doit faire differement :)

c'est marrant ces libs, avec du Cpp, on peut ajouter des templates, de la surcharge d'operateurs, de l'algebre...
sinon, pourquoi
#  printf("%d!\n",k);
# puts(f[k]);

et pas
printf("%d!\n %s\n", k, f[k]); ?

Commentaire de LeFauve42 le 23/04/2007 11:48:40

Salut,

Je suis d'accord avec coucou747. Tu peux gagner beaucoup de temps en mettant plusieurs chiffres ensemble.

Un bon compromis est de mettre 4 chiffres dans un int 32bits (ou compter en "base 10000"). Comme on peut en stocker jusqu'a 8, ca permet de multiplier deux "chiffres" sans debordement.

Eric

Commentaire de neocracker le 20/02/2009 04:44:29

Slt,

Il faut travailler sur un tableau unsigned long où chaque élément du tableau est un chiffre en base 2^64, ensuite il faut appliquer le bon vieux algo de primaire sur ces chiffres. C'est, d'après moi, la méthode avec le meilleur rapport simplicité/vitesse/espace mémoire.

Les changements de base me semble inutile car pour l'ordinateur une addition se fait sur 32 ou 64 bits.

Cordialement

VDB Tristan

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Fonction racine carre puissance et factoriel [ par Samuel0210 ] Bonjour Voila, g creer 3 fonctions pour calculer la racine carre, la puissance et le factoriel de different nombres elles se compile sans erreur mé e factoriel [ par AlexMAN ] Bonsoir, Voila la kestion : "Quelqu'un sait-il comment borner la puissance de 10 maximale de n! en fonction de n?" (vecchio56...)En fait, jmré savoir Probleme dans prog de calcul de PI [ par Jarod1980 ] Bonjour tout le monde,J'ai un petit programme basic pour calculer PI en utilisant la formule de Ramanujan:1&nbsp;&nbsp;&nbsp; 2^(3/2)&nbsp; inf&nbsp;& factoriel et cosinus [ par Endrew ] bonjours à tous,Depuis plusieurs jours, je tente de régler un problème sans succés,J'essai d'utiliser la série de taylor en C<img src="http://www.cppf Fontion factoriel [ par valerian13 ] Dans le code suivant, si je ne déclare pas résultat dans la fonction main, il y a une erreure, par contre si met "int resultat=1;" le résultat sera to slt comment calculer le factoriel avec boucle for en c++ [ par sofinet1986 ] SOFINET


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales