PDA

Visualizza la versione completa : [C] Fattoriale dei numeri interi minori di un valore inserito


cristianc
31-05-2008, 17:44
Ciao,
avevo scritto questo programma per visualizzare il valore dei fattoriali di tutti i numeri interi minori o uguali di un certo valore immesso dall'utente attraverso la tastiera.

Ecco il listato che ho realizzato:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
int n,aux;
char numero[12];
long long int fat;
printf("\n\tCalcolo del fattoriale di tutti i numeri minori o uguali a N\n");
printf("\nInserisci n: ");
scanf("%s",&numero);
n=atoi(numero);
if ( (strchr(numero,'.')) || (n>-1) ) {
fat=1;
printf("\n0!= 1\n");
for(aux=1;aux<n+1;aux++) {
fat=fat*aux;
printf("%d!= %d\n",aux,fat);
}
}
printf("\n");
}

Il problema e' che nonostante le modifiche fatte (per esempio long long int fat)
per la natura del fattoriale se inserisco un numero anche basso sballa tutto per via dell'overflow credo.
In questi casi come sarebbe meglio impostare il programma?

Edit: mi ero scordato di far vedere l'esempio:


Calcolo del fattoriale di tutti i numeri minori o uguali a N Inserisci n: 42 0!= 1 1!= 1 2!= 2 3!= 6 4!= 24 5!= 120 6!= 720 7!= 5040 8!= 40320 9!= 362880 10!= 3628800 11!= 39916800 12!= 479001600 13!= 1932053504 14!= 1278945280 15!= 2004310016 16!= 2004189184 17!= -288522240 18!= -898433024 19!= 109641728 20!= -2102132736 21!= -1195114496 22!= -522715136 23!= 862453760 24!= -775946240 25!= 2076180480 26!= -1853882368 27!= 1484783616 28!= -1375731712 29!= -1241513984 30!= 1409286144 31!= 738197504 32!= -2147483648 33!= -2147483648 34!= 0 35!= 0 36!= 0 37!= 0 38!= 0 39!= 0 40!= 0 41!= 0 42!= 0

oregon
31-05-2008, 17:45
Non c'e' modo ...

pallinopinco
31-05-2008, 17:58
In questi casi come sarebbe meglio impostare il programma?


Ci sono librerie per gestire numeri enormi e/o in precisione arbitraria, tipo la GMP (http://gmplib.org/), la NTL (http://www.shoup.net/ntl/), la hFloat (http://www.jjj.de/hfloat/), etc.

cristianc
01-06-2008, 15:24
@pallinopico
ho letto il post.
Ci sono librerie del C che gestiscono anche queste situazioni?

Per esempio ci sono assert.h,complex.h,ctype.h,errno.h,fenv.h,float.h, intttypes.hiso646.h,eccetera...

pallinopinco
01-06-2008, 15:30
assert.h,complex.h,ctype.h,errno.h,fenv.h,float.h, intttypes.hiso646.h,eccetera...


Queste non sono librerie, ma header files. L'ANSI C non prevede caratteristiche per gestire valori con un numero arbitrario di cifre, quindi devi usare una delle librerie consigliate nel post (o cercarne altre).

oregon
01-06-2008, 15:35
Originariamente inviato da pallinopinco
Ci sono librerie per gestire numeri enormi e/o in precisione arbitraria, tipo la GMP (http://gmplib.org/), la NTL (http://www.shoup.net/ntl/), la hFloat (http://www.jjj.de/hfloat/), etc.

Ovviamente quando ti ho detto "non c'e' modo" intendevo nativamente in C (ovvero con i tipi numerici standard del C ...)

Quelle librerie ovviamente risolvono il problema ...

mondobimbi
01-06-2008, 16:03
se conosci il c++ puoi crearti tu un tipo HUGE che contenga numeri interi di dimensione arbitraria che sia trasparente rispetto agli operatori tradizionali.
Può essere un simpatico esercizio.
Puoi farlo anche in C ma non ti risulterebbe così trasparente.
ciao
sergio

cristianc
01-06-2008, 16:08
Ti ringrazio della risposta,ma conosco solo il linguaggio c.Non ho mai programmato in c++.
So che prima di farlo occorre conoscere almeno le basi di c.
Comunque sono disposto a farlo in C anche se e' piu complicato.
In ogni caso come devo comportarmi nel gestire programmi come il fattoriale?

oregon
01-06-2008, 16:12
Originariamente inviato da cristianc
Comunque sono disposto a farlo in C anche se e' piu complicato.

Quello che ti ha detto Sergio è abbastanza complicato in C++ ... anche in C potresti farlo, ma si ridurrebbe tutto a scrivere da solo parte di quelle librerie ... e sarebbe complesso anche per chi ha una ottima preparazione ...


In ogni caso come devo comportarmi nel gestire programmi come il fattoriale?

Con il C, puoi calcolare il fattoriale fino ad un certo punto ... se vuoi andare oltre devi usare le librerie di cui si è detto ... non capisco questa tua ulteriore domanda ...

pallinopinco
01-06-2008, 16:16
In ogni caso come devo comportarmi nel gestire programmi come il fattoriale?


Avendolo ripetuto più volte pensavo fosse chiaro: se vuoi gestire numeri di grandi dimensioni devi usare una di quelle librerie (o riscrivertela da zero, ma non vedo perché dovresti reinventare la ruota).

Loading