Visualizzazione dei risultati da 1 a 3 su 3

Discussione: c++ numeri enormi

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    11

    c++ numeri enormi

    Ad esempio, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800
    e la somma delle cifre nel numero 10! è 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.


    Trova la somma delle cifre nel numero 100!
    codice:
    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
    
    
    	double risultato=1;
    	int array[1000];
    	unsigned long long somma = 0;
    	cout << "Wait! " << endl;
    	for (int i = 1; i <= 100; ++i)
    	{
    		risultato = risultato * i;	
    
    
    	}
    	string risultato1 = to_string((double)risultato);
    	string carattere;
    	int lunghezza = risultato1.size();
    	int lunghezza1 = risultato1.size();
    	string part = risultato1.substr(0, lunghezza - 7);
    	int lunghezza2 = part.size();
    	cout << "Il risultato e': " << risultato << endl;
    	cout << "Il risultato e': " << part << endl;
    	cout << "La lunghezza della stringa e' :" << lunghezza2 << endl;
    	for (int y = 0; y <= lunghezza2-1; y++)
    	{
    	 carattere = part.at(y);
    		 array[y] = stoi(carattere);
    		 somma = somma + array[y];
    	}
    	cout << "La somma fattoriale e': " << somma << endl;
    	system("pause");
    }
    La logica del programma è corretta, ma il risultato è sbagliato, mi risulta 683 anziché di 648
    Non capisco l'errore

  2. #2
    100! richiede 525 bit per essere rappresentato come intero; risultato è un double, e i double hanno una mantissa di 53 bit (52 espliciti + 1 implicito); questo significa che da 2^54 in poi i double non hanno più la granularità adeguata per rappresentare tutti gli interi.
    Ora, la cosa per i fattoriali è un po' più complicata (dato che si tratta di numeri che hanno "dentro la pancia" un sacco di fattori due, che quindi vanno a finire nell'esponente, non nella mantissa), ma in ogni caso arriva un punto in cui la mantissa non basta più. Qui avevo fatto il conto per i long double (che, sulle piattaforme su cui sono supportati, in genere sono 80 bit, di cui 64 di mantissa; per i double "normali" il conto è simile sistemando i numeri), e salta fuori che anche lì da 26! in poi non c'è più precisione a sufficienza.

    Long story short, con l'approccio naïf e i tipi "normali" non te la cavi...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    11
    Grazie mille MITALY!

Tag per questa discussione

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 © 2025 vBulletin Solutions, Inc. All rights reserved.