Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383

    [c]fattoriale

    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:

    codice:
    #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:

    codice:
    	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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Non c'e' modo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    In questi casi come sarebbe meglio impostare il programma?
    Ci sono librerie per gestire numeri enormi e/o in precisione arbitraria, tipo la GMP, la NTL, la hFloat, etc.
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    @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...

  5. #5
    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).
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da pallinopinco
    Ci sono librerie per gestire numeri enormi e/o in precisione arbitraria, tipo la GMP, la NTL, la 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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    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?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    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).
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.