2012-10-10 13 views
9

Voglio calcolare !1000 in clojure, come posso fare questo senza ottenere un'eccezione di overflow-intero?Clojure - Calcola con numeri grandi

Il mio codice fattoriale è adesso: (reduce * (range 1 1001)).

risposta

19

Si potrebbe utilizzare l'operatore *' che sostiene precisione arbitraria, promuovendo automaticamente il risultato al BigInt nel caso sarebbe traboccare:

(reduce *' (range 1 1001)) 
+0

Grazie! È stato un po 'più facile e più pulito. – Sawny

+0

Quali sono i pro/contro di farlo in questo modo al posto di @ Hamza? – Sawny

+0

Può accettare input arbitrari. @Hamza dovrebbe usare 'bigint' – noahlz

6

Put N alla fine del numero che lo rende un bigint,

(reduce * (range 1N 1001N)) 
2

costringere i parametri per clojure.lang.BigInt

(reduce * (range (bigint 1) (bigint 1001))) 

I.e. se lavori con una libreria di terze parti che non utilizza *'

(defn factorial' [n] 
    (factorial (bigint n)))