我正试图解决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>楼层(sqrt(6))但除以6。
然后,您应该将floor(sqrt(n))放在一个变量中,并在for中使用该变量,否则您将重新计算它为every操作,这非常昂贵。
关于c++ - 需要一种使此代码运行更快的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20685041/