2009-06-06 10 views
6

C#で大きな整数を扱うにはどうすればよいですか?Cでの "大きな"整数の処理#

私は私の除数の積を与える機能を持っている:

private static int GetDivisorProduct(int N, int product) 
    { 
     for (int i = 1; i < N; i++) 
     { 
      if (N % i == 0) 
      { 
       Console.WriteLine(i.ToString()); 
       product *= i; 
      } 
     } 

     return product; 
    } 

呼び出し関数は、結果は4桁の数字よりも大きい場合、私は最後の4桁の数字を取得する必要がありGetDivisorProduct(N, 1)

です。 (たとえば、957の入力を与えた場合、最後の4つの値だけを切り捨てた後の出力は7493です。 実際の結果は876467493です)。

他のサンプル入力:私は10000与えた場合、出力は0

BigIntegerクラスは、C#ライブラリから削除されています!

最後の4桁を取得するにはどうすればよいですか?

+0

関連する質問を参照してください:http://stackoverflow.com/questions/959923/handle-big-integers-in-c –

+3

同じ質問が表示されますか? – heavyd

答えて

27

最後の4桁のみを表示している場合は、整数より大きい値は必要ありません。このことを考えてみましょう:

あなたは(最後の4桁の数字すなわち)最下位の桁数にのみ関心がある場合、2つの数値を乗じ、その後、一番上の桁が結果の最下位桁に影響を持っていません。 ..を乗算する前に、を投げてを最上位(右側)の数字にすることができます。例えば

:私は2つの大きな数を乗算したいが、私は最後の2桁のみが必要になります。

int num1 = 123456789; 
int num2 = 987654321; 

int result = num1 * num2; // Last two digits would be "69" but this OVERFLOWS 

が、我々は最後の2桁のみを掛ける場合は...= 1869

int result = (num1 % 100) * (num2 % 100); // result = 89 * 21 

89 * 21(最後の2桁はまだ "" ですが、我々はをオーバーフローしていない)。

私はSix Right-Most Digits of 1,000,000 factorialを計算するのにこのテクニックを使用しました。

は、あなたが今、.NET 4.0に行くことができない場合は、C#のからのJ#ライブラリからのBigIntegerを使用することができます

ロバートC. Cartaino、

+7

モジュラ算術:(a * b)%m ==((a%m)*(b%m))%m –

+0

これは、私の長年の実例を説明するはるかに簡潔な方法です。 –

0

intの代わりにdoubleまたはlongを使用するのはどうですか?それは場合によってはうまくいくかもしれませんが、あなたができるより大きな数字で作業することができます。

+0

私はすでにダブル、ロングなどで試したことがあります。同じ結果です。 –

+0

申し訳ありませんが私はより多くの助けになることができませんでした!がんばろう! – Pwninstein

7

.NET 4.0はありBigIntegerクラス

+0

Sweet - BigIntegerクラスについて知らなかった! – TWith2Sugars

+2

OPはBigIntegerをまったく使用しないでください。ロバートの答えを見てください。 –

0

私はmissunderstoodなかった願っていますが、 "0000" コンソールに書きたい結果が0の場合は? は、あなたは試してみました:

Console.WriteLine(i.ToString().PadLeft(4,"0")); 

あなたが望むのは、数字0000をintとして取得することです。申し訳ありませんが、入手方法はわかりません。

+0

私はこのようにしました..しかし、それはすべて実現可能な解決策ではありません。 本当にそうだと思いますか? –

1

さて、あなたはこのようにコードを変更することができます。

for (int i = 1; i < N; i++) 
    { 
     if (N % i == 0) 
     { 
      Console.WriteLine(i.ToString()); 
      product *= i; 
     } 
     if (product > 10000 * N) 
     { 
      product %= 10000; 
     } 
    } 

(10000 * K + L)の最後の4桁Rは、実際の型リットル R.と同じであるためですあなたが扱いたいNの範囲に依存します。すべて整数型の場合、製品は長くなければなりません。

ちなみに、常に1の場合、パラメータとして商品を渡すのはなぜですか?

関連する問題