我如何解决欧拉问题12?

时间:2011-08-04 05:37:09

标签: c++

  

可能重复:
  Project Euler Problem 12 - C++

我一直在研究Euler问题并遇到问题12。我读了一些关于大数字的数学解决方案,但我仍然没有得到正确答案。这是我的代码:

#include <iostream>
using namespace std;

int divisorCount(const unsigned long long x)
{
    int divizers = 0;
    unsigned long long i = 1;
    while(i <= x/i)
    {
        if(x % i == 0)
        {
            divizers++;
        }
        i++;
    }
    return divizers;
}

int main()
{
    bool test;
    unsigned long long total = 0, spread = 1;
    int divisors = 1;

    while(divisors < 501)
    {
        total+=spread;
        divisors = divisorCount(total);
        spread++;
        if(divisors > 501)
            cout << total << " " << spread << " " << divisors << endl;
    }


    cout << total << " is divisible by 500+ numbers" << endl;
    system("pause");
    return 0;
}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

x的除数高于sqrt(x),所以解决这个问题:

while(i <= x/i)

为:

while(i <= x)

此外,请在打印后执行spread++;,以便显示正确的数字。

注意:为了测试,最好在打印前删除if,以便了解正在发生的事情。

注意2:解决此问题的更快捷方法是实现这些数字的属性,请参阅:triangular numbers。 Euler项目基于数学,因此不要编写强力解决方案。

答案 1 :(得分:1)

考虑一下你的if陈述:

if(x % i == 0)
{
    divizers++;
}

由于ix的因素,您可以立即记下x的其他因素吗?如果3是24的因子,你知道24的其他因素是什么?这个暗示中有一个隐藏的捕获,只是你知道。