2016-03-30 12 views
-8

非常に大きな電力を計算するにはどうすればよいですか?たとえば、1000000000000000000の数値大きな指数関数を計算するにはどうすればよいですか?

+3

これは計算を行うことで計算されるため、実際に何か他のものを求めている必要があります。現時点であなたが計算している問題は何ですか?あなたはそのような大きな数を保存する方法を知らないという問題はありますか?あなたはそれをすばやく計算する方法を知らないのですか?それともあなたを止めている何か他のものですか? –

+0

答えの最初の「n」桁と合計桁数が必要ですか?すべての桁で正確な出力が必要な場合は、桁数が多いため不可能です。 –

+0

"不可能"はちょっとした誇張です。実際の唯一の限界は、答えを保持するためのメモリであり、計算上の複雑さではありません。十分な金額があれば、 '2 ^(10^18)'の結果を格納できるデータセンターを構築することは確かに可能です。 –

答えて

2

Int64の範囲を超える大きな数値の場合、.NETはBigIntegerクラス(「任意に大きな符号付き整数を表す」)を持ちます。実際には、BigIntegerが表すことができる値は、使用可能なシステムメモリとそのメモリをすべて割り当てるCLRの能力によって制約されます。

理論的には、このようなことができますが、実際にはBigInteger.Pow(value, int.MaxValue)になる前にメモリが足りなくなる可能性があります。

var value = new BigInteger(x); 
var result = BigInteger.Pow(value, 1000000000); 
result = BigInteger.Pow(result, 1000000000); 

BigInteger.Powは、第二引数の正規intがかかるため、あなたが2つ(またはそれ以上)が必要になりますことをご注意intの範囲内に収めることができるよりも大きな電力を計算するために呼び出します。

つまり、BigIntegerでの演算は、通常の数値型の数値演算よりもはるかに遅くなることを理解することも重要です。したがって、全体的な目標が何であるか、およびそれに頼らずに達成する方法があるかどうかを慎重に検討する必要があります。 BigIntegerを使用してください。

+3

これは動作しません。結果は長すぎてメモリに格納できません。あなたは 'System.OutOfMemoryException'を取得します。 –

+0

@IvanGritsenko入力に依存しませんか?入力が比較的小さい場合、出力は大きくなりますが、決して管理不能ではありません –

+2

あなたは正しいですが、 'value = 1'のために*働くだけです。 –

0

pow(value、1000000000000000000)のような値を格納できるC#のデータ型はありません(値が1の場合を除く)。 BigIntegerでもこのような大きな数値を格納できません。

+0

技術的に彼は自分のタイプを書くことができました。 –

+0

@KevinWellsは技術的に正しいです。しかし、最終結果は一連の文字として保存する必要があります(文字列のようになる可能性があります) – DivideByzero

+0

この方程式にはメソッドがない場合、電卓のウィンドウでどのようにプログラムされましたか? –

関連する問題