2011-12-14 13 views
2

私はProject Eulerで作業しており、問題が発生しました。C#で1000桁の数字

私は1000桁の数字を使用することができず、私が何か間違っているかどうかを知りたかったのですが、この解決策を間違った方法で行っています。

C#

namespace ToThePowerOf 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      BigInteger n = 1; 
      int x = 0; 
      BigInteger [] number; 
      number = new BigInteger[149194]; 
      number[x] = 1; 
      number[x + 1] = 1; 
      x = 3; ; 
      BigInteger check = 10000000000000000000000000000 
           0000000000000000000000000000000 
           0000000000000000000000000000000 
           0000000000000000000000000000000 
           0000000000000000000000000000000 
           0000000000000000000000000000000 
           0000000000000000000000000000000 
           0000000000000000000000000000000 
           0000000000000000000000000000000 
           00000000000000000000000; 

      for (int i = 99; i > 0; i--) 
      { 
       n = (n - 1) + (n - 2); 
       number[x] = n; 
       x++; 
       if (n > check) 
       { 
        Console.WriteLine(x); 
       } 
      } 
     } 
    } 
} 
+3

これはソースコードのペーストですか?そうであれば、番号内に改行がありますが、許可されていません。 Btw、Fibbonaci数生成のためのより良い、より速い公式があります。 – SWeko

+1

ところで、1000桁の数字を取得するには、BigInteger(10).Pow(1000)ではなく、BigInteger(10).Pow(999)を使用します。複数のポスターがこれを間違えてしまった! – TonyK

+1

@Ramhound:証拠によれば、彼は... – TonyK

答えて

13

私は「あなたはに走った「問題は」(エラーメッセージを含むように役立つだろう)コンパイラはあなたができるので、千桁の整数リテラルを好きではないということです推測していますそれを非常に大きな整数リテラルで初期化します。他者が指摘しているように、整数リテラルを複数の行に分割することは有効ではありません。コンパイラは1リテラル整数を扱うことができるので、

number[x] = 1;ラインは、仕事と私たちはBigIntegerに割り当てているので、それはBigIntegerimplicit operatorBigIntegerに変換するために使用しています。リテラル大きな整数であなたの問題を回避する


一つの簡単な方法は、あなたの千桁の数字を作成するために、BigInteger.Parseメソッドを使用することです。

BigInteger check = BigInteger.Parse("10000....", CultureInfo.InvariantCulture); 

もう一つの方法は、その後、小さなint型でそれを初期化Jon Skeet's answerのように、あなたが希望数に到達するために数学を使用することができます。

+0

このオーバーロードはhttp://msdn.microsoft.com/en-us/library/dd268289.aspxを使用し、CultureInfo.InvariantCultureに安全な側にいてください。 –

+0

良い点は編集されています(異なる文化が整数を別々に表現しているとは考えていませんでした)。 –

+0

ありがとうございます。これは完全に働いた:) – monkeylumps

13

C#でBigIntegerのリテラルサポートはありません。したがって、BigIntegerを使用している間違っていない間は、別の方法でインスタンス化する必要があります。 new BigInteger(10).Pow(1000)

4

このような大きなリテラルはできません。整数リテラルは最大で64ビットです。

大きなbigintegerを取得するには、文字列から変換するか、ハードコーディングする代わりに数値を計算します。あなたの場合、BigInteger.Pow(10, digits)で計算するのが最もクリーンな解決策です。

0

私はまだC#で​​のBigIntegerの処理についてはまだ分かりませんが、あなたが参照するProject Eulerの質問ではまだわかりません。テキストファイルから手紙で数字を読み取ってintに変換することができます。その後、乗算とチェックを行います。エレガントではないが動作します!

構文refについてはhttp://msdn.microsoft.com/en-us/library/system.io.filestream.aspxを参照してください。

0

私はおそらくこれに遅れていますが、私がしたことはすべての数値をとり、配列内の別のオブジェクトにすることでした。私はその後、配列の最初の5つの数字を取り出し、それらを掛け合わせて変数に設定しました。それらが最大値より大きい場合は、最大値に設定します。その後、次の1〜6のセットに進み、同じことをしました。範囲外の例外が発生しました。その場合は、この例外を受け取るまでtryとget形式を使用します。コードを見たいのであれば、私は自分のレスポンスを編集しますが、配列に時間を節約するために、まだこれを試したいのであれば、配列を渡します。

long[] a; 
a = new long[] { 
      7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9,2,2,5,1,1,9,6,7,4,4,2,6,5,7,4,7,4,2,3,5,5,3,4,9,1,9,4,9,3,4, 
      9,6,9,8,3,5,2,0,3,1,2,7,7,4,5,0,6,3,2,6,2,3,9,5,7,8,3,1,8,0,1,6,9,8,4,8,0,1,8,6,9,4,7,8,8,5,1,8,4,3, 
      8,5,8,6,1,5,6,0,7,8,9,1,1,2,9,4,9,4,9,5,4,5,9,5,0,1,7,3,7,9,5,8,3,3,1,9,5,2,8,5,3,2,0,8,8,0,5,5,1,1, 
      1,2,5,4,0,6,9,8,7,4,7,1,5,8,5,2,3,8,6,3,0,5,0,7,1,5,6,9,3,2,9,0,9,6,3,2,9,5,2,2,7,4,4,3,0,4,3,5,5,7, 
      6,6,8,9,6,6,4,8,9,5,0,4,4,5,2,4,4,5,2,3,1,6,1,7,3,1,8,5,6,4,0,3,0,9,8,7,1,1,1,2,1,7,2,2,3,8,3,1,1,3, 
      6,2,2,2,9,8,9,3,4,2,3,3,8,0,3,0,8,1,3,5,3,3,6,2,7,6,6,1,4,2,8,2,8,0,6,4,4,4,4,8,6,6,4,5,2,3,8,7,4,9, 
      3,0,3,5,8,9,0,7,2,9,6,2,9,0,4,9,1,5,6,0,4,4,0,7,7,2,3,9,0,7,1,3,8,1,0,5,1,5,8,5,9,3,0,7,9,6,0,8,6,6, 
      7,0,1,7,2,4,2,7,1,2,1,8,8,3,9,9,8,7,9,7,9,0,8,7,9,2,2,7,4,9,2,1,9,0,1,6,9,9,7,2,0,8,8,8,0,9,3,7,7,6, 
      6,5,7,2,7,3,3,3,0,0,1,0,5,3,3,6,7,8,8,1,2,2,0,2,3,5,4,2,1,8,0,9,7,5,1,2,5,4,5,4,0,5,9,4,7,5,2,2,4,3, 
      5,2,5,8,4,9,0,7,7,1,1,6,7,0,5,5,6,0,1,3,6,0,4,8,3,9,5,8,6,4,4,6,7,0,6,3,2,4,4,1,5,7,2,2,1,5,5,3,9,7, 
      5,3,6,9,7,8,1,7,9,7,7,8,4,6,1,7,4,0,6,4,9,5,5,1,4,9,2,9,0,8,6,2,5,6,9,3,2,1,9,7,8,4,6,8,6,2,2,4,8,2, 
      8,3,9,7,2,2,4,1,3,7,5,6,5,7,0,5,6,0,5,7,4,9,0,2,6,1,4,0,7,9,7,2,9,6,8,6,5,2,4,1,4,5,3,5,1,0,0,4,7,4, 
      8,2,1,6,6,3,7,0,4,8,4,4,0,3,1,9,9,8,9,0,0,0,8,8,9,5,2,4,3,4,5,0,6,5,8,5,4,1,2,2,7,5,8,8,6,6,6,8,8,1, 
      1,6,4,2,7,1,7,1,4,7,9,9,2,4,4,4,2,9,2,8,2,3,0,8,6,3,4,6,5,6,7,4,8,1,3,9,1,9,1,2,3,1,6,2,8,2,4,5,8,6, 
      1,7,8,6,6,4,5,8,3,5,9,1,2,4,5,6,6,5,2,9,4,7,6,5,4,5,6,8,2,8,4,8,9,1,2,8,8,3,1,4,2,6,0,7,6,9,0,0,4,2, 
      2,4,2,1,9,0,2,2,6,7,1,0,5,5,6,2,6,3,2,1,1,1,1,1,0,9,3,7,0,5,4,4,2,1,7,5,0,6,9,4,1,6,5,8,9,6,0,4,0,8, 
      0,7,1,9,8,4,0,3,8,5,0,9,6,2,4,5,5,4,4,4,3,6,2,9,8,1,2,3,0,9,8,7,8,7,9,9,2,7,2,4,4,2,8,4,9,0,9,1,8,8, 
      8,4,5,8,0,1,5,6,1,6,6,0,9,7,9,1,9,1,3,3,8,7,5,4,9,9,2,0,0,5,2,4,0,6,3,6,8,9,9,1,2,5,6,0,7,1,7,6,0,6, 
      0,5,8,8,6,1,1,6,4,6,7,1,0,9,4,0,5,0,7,7,5,4,1,0,0,2,2,5,6,9,8,3,1,5,5,2,0,0,0,5,5,9,3,5,7,2,9,7,2,5, 
      7,1,6,3,6,2,6,9,5,6,1,8,8,2,6,7,0,4,2,8,2,5,2,4,8,3,6,0,0,8,2,3,2,5,7,5,3,0,4,2,0,7,5,2,9,6,3,4,5,0 
     }; 
関連する問題