2012-10-10 7 views
9

クロージャで!1000を計算したいが、どうすれば整数オーバーフローの例外が発生することなくこれを行うことができますか?Clojure - 大きい数値で計算する

私の階乗コードは今すぐ:(reduce * (range 1 1001))です。

答えて

19

あなたは自動的にそれがオーバーフローする場合のBigIntに結果を促進することにより、任意の精度をサポートしています*'演算子使用することができます

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

ありがとう、サードパーティ製のライブラリを使用している場合それはもう少し簡単で清潔でした。 – Sawny

+0

@ハムザの代わりにこのようにすることの長所と短所は何ですか? – Sawny

+0

任意の入力を受け入れることができます。 @Hamzaは 'bigint'を使うべきです – noahlz

6

それBIGINTになり数の最後に置かN、

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

clojure.lang.BigInt

(reduce * (range (bigint 1) (bigint 1001))) 
にパラメータを強制し0

I.e. *'

(defn factorial' [n] 
    (factorial (bigint n))) 
関連する問題