我正在尝试解决 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,并且 b
是 a
的分隔符,那么 c
也将是a
但 c
的分隔符可能大于 floor(sqrt(a))
,例如 3 > floor(sqrt(6))但除以 6。
那么你应该把你的 floor(sqrt(n)) 放在一个变量中并在 for 中使用该变量,否则你会在每个操作中重新计算它,这是非常昂贵的。
关于c++ - 需要一种方法让这段代码运行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20685041/