2011-12-16 18 views
0

project eulerの30番目の問題を解決しようとしています。プロジェクトオイラー演習30

My implementation of this problemは4乗で良好な結果が得られますが、5乗の答えはサイトで受け入れられません。

誰かが自分のコードで何が間違っているか説明できますか?

また、上限をチェックするための自分の計算式が正しいかどうかはわかりません。そうでない場合、私は良い解決策を知っていただければ幸いです。私の理論が正確であるならば、私はaskedをした

class P30 
{ 
    static void Main(string[] args) 
    { 

     Console.WriteLine(" " + GetMatchingNumbers(4).Sum()); 

     Console.WriteLine(" " + GetMatchingNumbers(5).Sum()); 
     Console.ReadLine(); 
    } 

    static IEnumerable<int> GetMatchingNumbers(int power) 
    { 
     for (int i = 2; i <(power + 1)*(Math.Pow(9,power)); i++) 
     { 
      var sumOfPowers = 0; 
      var tempi = i; 
      for (int x = 0; x < power; x++) 
      { 
       sumOfPowers += (int)Math.Pow(tempi % 10, power); 
       tempi /= 10; 
      } 
      if (sumOfPowers == i) 
      { 
       yield return i; 
       Console.WriteLine("With Power {0}, {1} matches", power, i); 
      } 
     } 
    } 
} 

[編集]:ここ

は私のコードです。

+0

intをlongに置き換えようとしましたか?私はあなたの計算が整数の容量をオーバーフローしていると思わ... –

+0

また、あなたのループの上限については確かですか?どのようにこの価値を考え出しましたか? –

+0

@ThomasLevesque:オーバーフローはありません... –

答えて

2

あなたのコードは、チェックしている番号の最初の5桁の数字だけを合計しています。

代わりの

for (int x = 0; x < power; x++) 

ます。これは、あなたが必要欠番を生成

代わり

while (tempi > 0) 
をwhileループを使用する必要があります。 (ヒントは6桁です)

+0

よく目に付きます;すべての一致する数字が4桁しかないので、4番目のパワーで動作します... –

+0

どうか恥ずかしがり屋: 'x <= power'でループ条件を置き換えて、 –

+0

@SteveBで動作しますが、これはまだ正しくありません一般的なケース... –