2011-12-16 36 views
0

我试图解决project euler的第30个问题。欧拉项目练习30

My implementation of this problem对4次方产生良好效果,但对于5次方的回答不被网站接受。

有人可以解释我的代码中有什么问题吗?

此外,我不知道我的检查上限公式是否正常。如果不是,我会很高兴知道要解决问题。

这里是我的代码:

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); 
      } 
     } 
    } 
} 

[编辑]asked如果我的理论是准确的。

+0

你是否试图用long替换int?我怀疑你的计算溢出了int的容量... – 2011-12-16 13:03:25

+0

另外,你确定你的循环的上限?你是怎么想出这个价值的? – 2011-12-16 13:05:16

回答

2

你的代码只是将它正在检查的数字的前5位数相加。

而不是

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

你应该使用while循环,而不是

while (tempi > 0) 

这会产生你所需要的缺号。 (提示它的长度是6位数。)