我正试图解决Project Euler problem 401。他们唯一能让我找到解决办法的就是暴力我已经运行这个代码10分钟了,没有任何答案。有人能帮我改进一下吗。
代码

#include <iostream>
#include <cmath>
#define ull unsigned long long

using namespace std;

ull sigma2(ull n);
ull SIGMA2(ull n);

int main()
{
    ull ans = SIGMA2(1000000000000000) % 1000000000;

    cout << "Answer: " << ans << endl;

    cin.get();
    cin.ignore();

    return 0;
}

ull sigma2(ull n)
{
    ull sum = 0;
    for(ull i = 1; i<=floor(sqrt(n)); i++)
    {
        if(n%i == 0)
        {
            sum += (i*i)+((n/i)*(n/i));
        }
        if(i*i == n)
        {
            sum -= n;
        }
    }
    return sum;
}

ull SIGMA2(ull n)
{
    ull sum = 0;
    for(ull i = 1; i<=n; i++)
    {
        sum+=sigma2(i);
    }
    return sum;
}

最佳答案

您缺少一些分隔符,如果a/b=c,ba的分隔符,则c也将是a的分隔符,但c可能大于floor(sqrt(a)),例如3>楼层(sqrt(6))但除以6。
然后,您应该将floor(sqrt(n))放在一个变量中,并在for中使用该变量,否则您将重新计算它为every操作,这非常昂贵。

关于c++ - 需要一种使此代码运行更快的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20685041/

10-10 22:34