Calcul du factoriel des grands nombres en toute rapidité

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 155 fois - Téléchargée 20 fois

Contenu du snippet

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 / Exemple :


#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!

A voir également

Ajouter un commentaire

Commentaires

Messages postés
35
Date d'inscription
vendredi 7 février 2003
Statut
Membre
Dernière intervention
20 février 2009

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
Messages postés
239
Date d'inscription
vendredi 20 octobre 2006
Statut
Membre
Dernière intervention
20 avril 2009

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
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
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]); ?
Messages postés
173
Date d'inscription
jeudi 20 décembre 2001
Statut
Membre
Dernière intervention
22 août 2008

Je suis impression par l'efficacité de ton programme, alors que la source fait à peine 50 lignes !
Messages postés
20
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
26 mai 2011

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
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.