begin process at 2013 05 26 05:02:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > FACTORIEL DE N POUR N GRAND

FACTORIEL DE N POUR N GRAND


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Niveau :Initié Date de création :20/04/2005 Vu / téléchargé :4 328 / 107

Auteur : nico8

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Quand on veut calculer le factoriel d'un grand nombre, les algorithmes de base itératifs ou récursifs sont vite dépassés. En effet, lorsque n augmente, n! dépasse rapidement la valeur maximun que peut contenir un mot de mémoire. Admettons une machine dont tous les mots ont la meme taille, par exemple 32 bits : la valeur exacte d'un entier  stocké dans un mot ne peut dépasser 2^31, ce qui équivaut a 14!.
Pour n>14, on ne pourra donc ni stocker n!, ni effectuer l'opération (n-1)!*n .


Ce programme vous permettra de calculer jusqu'a 2147! en stockant le résultat du calcul n! dans un tableau dont chaque élément est un chiffre de la décomposition, cadrée à droite, de n! dans une certaine base. Si Base=10^6, n(max)=2^31/Base=2147.

Source

  • #include <stdio.h>
  • #include <iostream.h>
  • #include <math.h>
  • #define TAILLE 2147
  • void fact(int n)
  • {
  • int tab[TAILLE];
  • int k=1;
  • int m,i,p;
  • int base=1000000;
  • int x,y;
  • //initialisation du tableau de stockage
  • for(i=0;i<TAILLE;i++) tab[i]=0;
  • tab[TAILLE-1]=1;
  • //Calcul des composantes du résultats et stockage ds le tableau
  • for(m=1;m<=n;m++)
  • {
  • p=0;
  • for(i=1;i<=k;i++)
  • {
  • x=(p+m*tab[TAILLE-i]);
  • y=x%base;
  • p=(x-y)/base;
  • tab[TAILLE-i]=y;
  • }
  • if(p!=0) tab[TAILLE+1-k]=p;
  • k++;
  • }
  • //affichage du résultat
  • k=0;
  • while(tab[k]==0) k++;
  • cout<<tab[k];
  • for(i=k+1;i<TAILLE;i++)
  • {
  • if (tab[i]<10) cout<<"00000"<<tab[i];
  • else if (tab[i]<100) cout<<"0000"<<tab[i];
  • else if (tab[i]<1000) cout<<"000"<<tab[i];
  • else if (tab[i]<10000) cout<<"00"<<tab[i];
  • else if (tab[i]<100000) cout<<"0"<<tab[i];
  • else cout<<tab[i];
  • }
  • cout<<endl;
  • }
  • void main()
  • {
  • int n;
  • int stop=1;
  • while(stop==1)
  • {
  • cout<<" Valeur de n(<=2147) : ";
  • cin>>n;
  • if((n<2148)&&(n>=0)) {cout<<n<<"!= ";fact(n);}
  • else if(n<0) stop=0;
  • else cout<<"En base 10^6, 2147! est le plus gros factoriel calculable"<<endl;
  • }
  • }
#include <stdio.h>
#include <iostream.h>
#include <math.h>

#define TAILLE 2147

void fact(int n)
{
int tab[TAILLE];
int k=1;
int m,i,p;
int base=1000000;
int x,y;

//initialisation du tableau de stockage
for(i=0;i<TAILLE;i++) tab[i]=0;
tab[TAILLE-1]=1;


//Calcul des composantes du résultats et stockage ds le tableau
	for(m=1;m<=n;m++)
	{
	p=0;
	
	for(i=1;i<=k;i++)
		{
		x=(p+m*tab[TAILLE-i]); 
		y=x%base;
		p=(x-y)/base;  
		tab[TAILLE-i]=y;
	}
	if(p!=0) tab[TAILLE+1-k]=p;
	k++;
	}

//affichage du résultat
k=0;
while(tab[k]==0) k++;


cout<<tab[k];
for(i=k+1;i<TAILLE;i++) 
{
if (tab[i]<10) cout<<"00000"<<tab[i];
else if (tab[i]<100) cout<<"0000"<<tab[i];
else if (tab[i]<1000) cout<<"000"<<tab[i];
else if (tab[i]<10000) cout<<"00"<<tab[i];
else if (tab[i]<100000) cout<<"0"<<tab[i];
else cout<<tab[i];
}
cout<<endl;
}


void main()
{
int n;
int stop=1;
while(stop==1)
{
cout<<" Valeur de n(<=2147) : ";
cin>>n;

if((n<2148)&&(n>=0)) {cout<<n<<"!= ";fact(n);}
else if(n<0) stop=0;
else cout<<"En base 10^6, 2147! est le plus gros factoriel calculable"<<endl;
}
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip (2 PUISSANCE N) POUR N GRAND

 Sources de la même categorie

Source avec Zip Source avec une capture FONCTIONS EN ACTION par ringo73
CALCUL DE PI AVEC LA BIBLIOTHÈQUE GMP par lann
Source avec Zip Source avec une capture MAGEO3D, POUR GÉRER LES POINTS ET LES VECTEURS DE L'ESPACE R... par pgl10
Source avec Zip Source avec une capture ALGORITHME ACO TOILE D'ARAIGNÉE par RyBeN
Source avec Zip Source avec une capture TRAITEMENT D'IMAGE EN C++, QT par Akham75

Commentaires et avis

Commentaire de luhtor le 20/04/2005 18:30:37

Il y a surement moyen d'enlever cette limite non ?
Tu devrais utiliser <iostream>.

Sinon c'est marant, j'ai vu a quel point la TI est minable pour calculer 400! :)

Commentaire de vecchio56 le 21/04/2005 12:06:16 administrateur CS

C'est normal luhtor avec un processeur cadencé a 10MHz on peut pas rivaliser
J'ai pas compris pourquoi 2147, ca dépend de la taille qu'on alloue non?

Commentaire de Saros le 21/04/2005 13:21:58

J'ai essayé de mettre tout en unsigned, pour essayer d'aller au-delà de 10^6, mais les résultats qu'il me donnent sont faux...
Quand j'utilise <iostream> sous Dev-C++, il me balance plein d'erreurs...

Commentaire de nico8 le 21/04/2005 14:16:17

Chaque chiffre du tableau étant inférieur à la base, il suffit que Base*n<2^31
n(max)=2^31/Base=2^31/10^6=2147.
Le plus grand factoriel calculable en base 10^6 est dc 2147!
Si tu veux aller plus loin, il faut changer de base : 10^5 par exemple.->n(max)=21474

Commentaire de heyboy le 03/06/2005 10:36:07

Bravo, excellente source ! :)
Cependant, petit bug, essaie par exemple de mettre un simple "." ...

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

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,733 sec (3)

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