質問
誰かがC#で非常に大きな整数を計算できる方法を知っていますか?
数値の階乗を計算しようとしています。
5! = 5*4*3*2*1 = 120
小さな数値の場合は問題ありませんが、unsigned int の最大値 4,294,967,295 の階乗を計算しようとすると、不可能のようです。
BigInteger クラスを調べましたが、必要なことを実行できないようです
助けていただければ幸いです
解決
4294967295! = 10 ^(10 ^ 10.597)〜10 ^(400億) この値は、C#のための任意のBigIntegerの実装を見つける場合でも、店にRAMの約40 GBのが必要です!
P.S。まあ、最適化された記憶手段と、それはRAMの〜18 GBのがかかります、の4バイトに9桁の数字を言わせます。
他のヒント
uint.MaxValue
の階乗を計算するには、ストレージののたくさんのを必要と思います。
たとえば、をrel="noreferrer">。あなたは狂ったような情報を得ることになるだろう。
私は強く を使用すると、時間の正気量で正気のコンピュータ上でそれを計算のいずれかの方法を見つけるつもりはないと思います。なぜあなたは、この値が必要なのでしょうか?スターリングの近似が十分に近いだろうか?
まず、それはuint.MaxValue
の階乗は、の天文学の大きさであることを指摘しておきます。私はその階乗の大きさのオーダーの良好な推定値を見つけることができないんだけど、うまく超えない場合は、そのビット表現はおそらく、標準RAMの高い割合を占めます。
BigInteger
クラスを使用すると、わずか約1,000,000またはその(非常に大まか)まで行きたい提供し、あなたが望むもののようです。その後、時間とメモリが非常に高額になります。 .NETの現在の(安定)バージョンでは、3.5まで、あなたはカスタム実装で行かなければなりません。 CodeProjectの上この1 には高い評価をしているようです。あなたは.NET 4.0のために開発されてしまった場合は、Microsoftのチームは最終的に<のhref = "http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(VS含む程度頂いております。 100).aspxの」relが= "noreferrer"> BCLのBigInteger
名前空間のSystem.Numerics
のクラス。いくつかのBigIntegerの実装とは異なり、.NET 4.0の中に既存のものは内蔵の階乗の方法(私はCodeProjectの1についてはよく分からない)がありませんが、1を実装するのは簡単でなければなりません - 拡張メソッドはいいだろう道ます。
あなたはBigIntegerのタイプを使用したくないと思うように見えるので、あなたはそれはあなたが私の返事を読ん望むものではないことを確認することができれば、それが参考になるし、それはあなたの目的に合わせていない理由を詳しく説明しますます。
なぜあなたは、あなたがそれらの階乗を計算する必要があると思いますか?これは、実際の計算を行うには何のためにpractiacally有用ではないのです。
(2 ^ 32-1)の階乗を計算するだけで結果は、多くのスペースを取るだろう、約16ギガバイト
計算自体はもちろん、多くの時間がかかります。あなたは高速なハードウェアに演算処理を転送することができるように、それが発明されたとして、あなたがプログラムをビルドする場合は、あなたがあなたの一生の中に結果を得ることができる必要があります。
それはあなたが解決しようとしているオイラーの問題のようなものだ場合は、ソリューションの多くが発見されていることを考えますそれはあなたが実際に答えを得るために計算する必要がないことです何elliminatingによるます。
ここに。 ストレート階乗マンから最速1、 - 。ピーターLuschny
現時点では、J# ライブラリの BigInteger クラスを使用できます。 その方法についての記事はこちら. 。を送信する必要があるため、展開が難しくなります。 J# 再頒布可能ファイル. 。に行くことも検討できます VS2010 ベータ版 として Framework 4.0 には BigInteger が含まれます.
あなたはJ番号の再頒布がインストールされている場合は、別の方法は、java.math.BigInteger
アセンブリへの参照を追加することにより、vjslib
を使用することでしょう。
このタスクの配列を使用してみてください。あなたは空きメモリ領域を持っているとして、あなたは長整数として使用することができます。配列のすべてのメンバーは、1つの10進数をrepsesents。あなたが必要とするだけではmultipicationを実装することです。
あなたはたとえば組み合わせのような階乗で計算を行っている場合は、めったにダウン1にすべての方法を乗算する必要はない(例えば98 * 98 * 97他のすべてが相殺するので)。