Fattoriale C++

Pubblicità

69GiGi96

Utente Attivo
Messaggi
337
Reazioni
24
Punteggio
39
Salve ragazzi, ho un dubbio..
Dovrei realizzare un programma in c++ che calcola il fattoriale di un numero intero non negativo inserito da tastiera.
Per ora niente funzioni ne ricorsioni.. Voglio cercare di riuscire a fare prima le cose più semplici
Avrei pensato a questa soluzione
PHP:
#include <iostream>
using namespace std;

int main()
{
    int numero,i,fattoriale;
    
    cout<< "Inserire un numero intero positivo: ";
    cin>> numero;
    
    fattoriale = 1;
    for (i=1; i<=numero ;i++)
    fattoriale = fattoriale*i;
    
    cout << "Il fattoriale di " << numero << " e' " << fattoriale <<endl;
Fino a 16 tutto ok.
A 17 mi da come risultato un numero negativo. Perchè?
A 50 mi da come risultato 0 a causa di overflow, credo.

Se provo ad usare il tipo float per poter rappresentare più numeri, provando con 50 mi da come risultato "inf"
Cosa sbaglio? :grat:

Con il tipo double inserendo 50 il risultato è 3.04141e+064
Non c'è un modo per visualizzare il risultato per esteso?

E se volessi implementare un controllo sul valore inserito da tastiera? Cioè far verificare che venga effettivamente inserito un valore intero positivo
Grazie!
 
Ultima modifica:
Per fattoriali tosti dai un'occhiata al paper di Fateman http://www.cs.berkeley.edu/~fateman/papers/factorial.pdf
Punto secondo inizializza la varibile fattoriale a uno plz

Domani da pc gli do un occhiata!

Eppure ricordo che all universitá il prof fece vedere una serie di fattoriali chilometrici.. Ci mettevano un pò a comparire del tutto a schermo talmente erano lunghi. Ma non ricordo come venne impostato l esercizio ne che tipo venne usato. :(

Per la questione della variabile fattoriale credo di non aver capito.. L ho gia inizializzata a 1. O no? :asd:
 
Basta che cambi il tipo di variabile.

17! supera altamente i valori che può contenere int. Di fatti, se metti double, non ti darà nessun errore.

EDIT: ho letto adesso la seconda parte del post. Adesso cerco come vederlo per esteso.

EDIT2: dichiara fattoriale come unsigned long long int (per la massima grandezza possibile) e te lo darà per esteso. Ovviamente puoi usare anche altri tipi di variabile.
 
Ultima modifica:
Basta che cambi il tipo di variabile.

17! supera altamente i valori che può contenere int. Di fatti, se metti double, non ti darà nessun errore.

EDIT: ho letto adesso la seconda parte del post. Adesso cerco come vederlo per esteso.

EDIT2: dichiara fattoriale come unsigned long long int (per la massima grandezza possibile) e te lo darà per esteso. Ovviamente puoi usare anche altri tipi di variabile.

Così già va meglio.. Arrivo a 65 o 66 non ricordo..Poi mi da 0 come risultato.
Quei fattoriali erano lunghi molte molte righe. :grat:
 
Alla fine ho usato il tipo long double e aggiunto la libreria iomanip
non mi convince questa soluzione, poiché un fattoriale cresce in modo esponenziale, è sufficiente dare in input un intero sufficientemente grande (e neanche tanto) per mettere fuori gioco qualunque tipo predefinito con lunghezza in bit prefissata. E poi, matematicamente è errato usare un double per il risultato quando il risultato è sicuramente un intero.

In realtà per fattoriali di lunghezza non definita a priori, dovresti creare in qualche modo una classe di interi a precisione arbitraria (o trovarne una già fatta) e, ahimé, scrivere manualmente il codice per definire le operazioni.
 
non mi convince questa soluzione, poiché un fattoriale cresce in modo esponenziale, è sufficiente dare in input un intero sufficientemente grande (e neanche tanto) per mettere fuori gioco qualunque tipo predefinito con lunghezza in bit prefissata. E poi, matematicamente è errato usare un double per il risultato quando il risultato è sicuramente un intero.

In realtà per fattoriali di lunghezza non definita a priori, dovresti creare in qualche modo una classe di interi a precisione arbitraria (o trovarne una già fatta) e, ahimé, scrivere manualmente il codice per definire le operazioni.

Si infatti anche cosi facendo mi pare che non supero 1000!..
Per la classe degli interi a precisione arbitraria credo che sia qualcosa di molto (troppo) complicato per me.
A stento sono riuscito a stendere questo nonostante i suoi difetti :asd:
 
Puoi usare GMP, che trovi praticamente su qualunque sistema. Esempio con il fattoriale:

Codice:
#include <iostream>
#include <string>
#include <cstddef>
using std::size_t;     // bug con size_t ; includere prima di gmp

#include <gmpxx.h>

int main()
{
   std::string s;
   std::getline(std::cin, s);
  
   mpz_class totalFactorial(1), end(s);

  for (mpz_class i(1); i <= end; ++i)
         totalFactorial *= i;

  std::cout << "Totale: " << totalFactorial << std::endl;

}
In C++11 puoi semplificare alcune dichiarazioni/definizioni:

Codice:
   auto totalFactorial = 1_mpz;
   auto end = mpz_class{s};
   
  for (auto i = 1_mpz; [...])
         [...]
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top