我一直在研究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;
}
有什么建议吗?
答案 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++;
}
由于i
是x
的因素,您可以立即记下x
的其他因素吗?如果3是24的因子,你知道24的其他因素是什么?这个暗示中有一个隐藏的捕获,只是你知道。