Domanda

Qualcuno sa di un modo per calcolare molto grandi numeri interi in C #

Sto cercando di calcolare il fattoriale di numeri per es.

5! = 5 * 4 * 3 * 2 * 1 = 120

con piccoli numeri questo non è un problema, ma cercando di calcolare il fattoriale del valore bigest di un unsigned int che è 4,294,967,295 non sembra possibile.

Ho esaminato la classe BigInteger ma non sembrano fare quello che mi serve

Qualsiasi aiuto sarebbe molto apprezzato

È stato utile?

Soluzione

4294967295! = 10 ^ (10 ^ 10,597) ~ 10 ^ (40 miliardi) Questo valore richiede circa 40 GB di RAM per memorizzare, anche se si trova qualsiasi implementazione BigInteger per C #!

P.S. Bene, con stoccaggio ottimizzato, diciamo 9 cifre in 4 byte, ci vorrà ~ 18 Gb di RAM.

Altri suggerimenti

Per calcolare il fattoriale di uint.MaxValue avresti bisogno di un molto di stoccaggio.

Per esempio, il Wikipedia articolo come 8,2639,316883 millions ... × 10 ^ 5.565.708. Stai andando a ottenere informazioni come un matto.

I con forza sospetta che non stai andando a trovare un modo di calcolare su un computer sano di mente in una quantità sana di tempo. Perché avete bisogno di questo valore? Sarebbe approssimazione di Stirling essere abbastanza vicino?

In primo luogo, vale la pena sottolineare che il fattoriale di uint.MaxValue è astronomicamente di grandi dimensioni. Io non sono in grado di trovare una buona stima dell'ordine di grandezza del suo fattoriale, ma la sua rappresentazione po 'probabilmente occupano una percentuale elevata di una RAM standard, se non ben superiore.

Una classe BigInteger sembra essere ciò che si desidera, fornendo desideri solo andare fino a circa 1.000.000 o giù di lì (molto approssimativamente). Dopo di che, il tempo e la memoria diventano molto proibitivo. Nelle attuali versioni (stabili) di .NET, fino a 3,5, si deve andare con un'implementazione personalizzata. Questo sul CodeProject sembra essere molto quotato. Se vi capita di essere in via di sviluppo per .NET 4.0, il team di Microsoft hanno finalmente ottenuto intorno ad includere un BigInteger classe nello spazio dei nomi System.Numerics del BCL. A differenza di alcune implementazioni BigInteger, quella esistente in .NET 4.0 non ha un metodo fattoriale built-in (non sono sicuro circa l'CodeProject uno), ma dovrebbe essere banale da implementare uno - un metodo di estensione sarebbe un bel modo.

Dal momento che lei sembra pensare che non si desidera utilizzare un tipo di BigInteger, sarebbe utile se potesse verificare che non è ciò che si desidera dopo aver letto la mia risposta, e poi spiegare con precisione il motivo per cui non soddisfa le vostre finalità .

Perché pensi che è necessario calcolare i fattoriali? Non è practiacally utile a tutto per fare i calcoli attuali.

Proprio il risultato del calcolo fattoriale di (2 ^ 32-1) prenderebbe un sacco di spazio, di circa 16 GB.

Il calcolo si sarà ovviamente prendere un sacco di tempo. Se si crea il programma in modo che è possibile trasferire il processo di calcolo di hardware più veloce in quanto è inventato, si dovrebbe essere in grado di ottenere il risultato all'interno della vostra vita.

Se si tratta di qualcosa di simile a un Euler problema che si sta tentando di risolvere, si consideri che un sacco di soluzioni si trovano da elliminating ciò è che in realtà non c'è bisogno di calcolare in modo da ottenere la risposta.

Qui . Il più veloce, direttamente dal Man fattoriale -. Peter Luschny

È possibile utilizzare la classe BigInteger dalle librerie # J per ora. Ecco un articolo su come . Esso rende la distribuzione più difficile perché si deve inviare il J # Redistributable . Si può anche prendere in considerazione di andare a VS2010 beta come Framework 4.0 avrà BigInteger .

Nel caso in cui si dispone di J # redist installato, un modo alternativo sarebbe utilizzando java.math.BigInteger con l'aggiunta di un riferimento all'assembly vjslib.

Provare a utilizzare una matrice per questo compito. Si potrebbe usare come interi lunghi come si dispone di spazio di memoria libera. Ogni membro dell'array repsesents una cifra decimale. L'unica che serve è di implementare multipication.

Se si sta facendo i calcoli con fattoriali, come ad esempio le combinazioni che raramente necessario moltiplicare tutta la strada fino a 1 (ad es. 98 * 98 * 97 dal momento che tutto il resto annulla).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top