2

我发现了几个与这个问题相关的主题,我只想知道为什么我的代码返回不正确的数据。所以我们必须找到第一个具有超过 500 个除数的三角形数。详细信息可以在这里找到:http ://projecteuler.net/problem=12 这是我的代码:

Int64 triangularnum = 1;
            for (Int64 num = 2; num > 0; num++)
            {
                if(has501Divisors(triangularnum))
                {
                    MessageBox.Show(triangularnum.ToString());
                    break;
                }
                triangularnum += num;
            }



private bool has501Divisors(Int64 candidate)
        {
            bool has501 = false;
            int count = 0;
            for (int i = 1; i < Math.Sqrt(candidate); i++)
            {
                if (candidate % i == 0) count += 1;
                if (count > 501)
                {
                    return true;
                }
            }
            return has501;
        }

这给了我号码 842161320,这显然是不正确的。

4

3 回答 3

3

你应该增加你的count号码2not 1

还有你的

if (count > 501)

部分不正确,因为您的边界不500应该501。将其更改为count > 500而不是。

static void Main(string[] args)
{
    Console.WriteLine(Find());
}

public static int Find()
{
    int number = 0;
    for (int i = 1; ; i++)
    {
        number += i; // number is triangle number i
        if (CountDivisorsOfNumber(number) > 500)
            return number;
    }
}


private static int CountDivisorsOfNumber(int number)
{
     int count = 0;
     int end = (int)Math.Sqrt(number);
     for (int i = 1; i < end; i++)
     {
         if (number % i == 0)
             count += 2;
     }
     if (end * end == number) // Perfect square
         count++;
     return count;
}

这打印出来76576500,看起来像是一个正确的解决方案。

于 2013-08-22T14:49:58.703 回答
2

问题是您将循环限制为平方根,这很聪明,但这意味着您需要将计数增加 2,而不是 1 来考虑两个除数。

将增量更改为:

if (candidate % i == 0) count += 2;

此外,您的计数检查会检查大于 501 个除数,而不是 500 个。

于 2013-08-22T14:50:12.917 回答
-1

快速查看,但您的检查不正确:

if (count > 501)

这将停止在计数 502,而不是 501。


for (int i = 1; i < Math.Sqrt(candidate); i++)

9 可以被 3 整除,所以你应该在这里使用 <=。另外,你要除以 1,你应该从 i = 2 开始。

于 2013-08-22T14:49:36.577 回答