项目欧拉问题12

时间:2011-05-31 04:28:37

标签: c#

我遇到Project Euler问题12.我的代码正确地生成了这个系列,据我所知,它得到了测试问题的正确解决方案。我不相信long会溢出,因为它确实会返回一个解决方案,而不是正确的解决方案。有什么想法吗?

  

三角形数字的序列是   通过添加自然生成   数字。所以第7个三角形数字   将是1 + 2 + 3 + 4 + 5 + 6 + 7 =   28.前十个任期将是:

     

1,3,6,10,15,21,28,36,45,55,   ...

     

让我们列出第一个因素   七个三角形数字:

     

1:1 3:1,3 6:1,2,3,6 10:1,2,5,10   15:1,3,5,15 21:1,3,7,21 28:   1,2,4,7,14,28我们可以看到28是   要结束的第一个三角形数字   五个除数。

     

第一个的价值是多少?   三角形数量超过五个   一百个除数?

class Program
{
    static long lastTriangle = 1;

    static void Main(string[] args)
    {
        long x = 1;
        do
        {
            x = nextTriangle(x);
            Console.WriteLine(x);
        } while (numDivisors(x) < 500);

        Console.WriteLine(x);
        Console.ReadLine();
    }

    static long nextTriangle(long arg)
    {
        lastTriangle += 1;
        long toReturn = lastTriangle + arg;
        return toReturn;
    }

    static long numDivisors(long arg)
    {
        long count = 0;
        long lastDivisor = 0;
        Boolean atHalfWay = false;
        for (long x = 1; x <= arg && !atHalfWay; x++)
        {
            if (arg % x == 0 && x != lastDivisor)
            {
                count++;
                lastDivisor = arg / x;
            }
            else if (x == lastDivisor)
            {
                atHalfWay = true;

            }
        }
        return count*2;
    }
}

2 个答案:

答案 0 :(得分:3)

如果x是正方形,numDivisors计算x的平方根两次。

答案 1 :(得分:1)

问题不在于完美正方形的平方根被计算两次。当arg是一个正方形时,numDivisors(arg)会给出一个完全错误的答案,而不仅仅是一个。考虑arg = 36。当x = 4时,lastDivisor设置为9.下一次迭代,x = 5;

if (36 % 5 == 0 && 5 != 9) // 36 % 5 == 1
else if (5 == 9)
// Nothing done, next x
if (36 % 6 == 0 && 6 != 9) // true
{
    count++;
    lastDivisor = 36 / 6; // 6
}
// next x
if (36 % 7 == 0 && 7 != 6) // 36 % 7 == 1
else if (7 == 6)
// next x

现在x永远不会等于lastDivisor,循环会一直运行到x == 36,所以所有除数都会被计算两次。

你的条件while (numDivisors(x) < 500)的另一个错误,问题是要求超过 500除数的第一个三角形数字,如果之前有一个正好有500个除数的那个,你会发现它。

为读者练习:为什么 - 在陈述的问题中 - 没有必要检查方块并只计算一次平方根?