所以我试图找到相当大数量的最大素数因子。这是关于Project Euler(http://projecteuler.net/problem=3)的问题。我的问题是,当我编译并运行我的程序时,命令提示符为空,它只是一个没有文本的黑色。
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
vector <int> factors;
bool isPrime(int number)
{
bool prime = true;
int maxIndex=number/2;
for (int index=2; index <= maxIndex; index++)
{
if (number % index == 0)
{
prime = false;
break;
}
}
return prime;
}
int Facts()
{
float num = 600851475143;
for (double i=1000000; i<=num; i++)
{
if (fmod(num,i)==0)
factors.push_back(i);
}
}
int main()
{
Facts();
for (int i=0; i<factors.size(); i++)
{
if (isPrime(factors[i]))
cout << i << ", " ;
}
return 0;
}
我发现可能程序花了很长时间,因为我要求它做的操作相当耗时。如果是这种情况,是否有更快的方法可以找到这个问题的答案?我没有看到我的代码有问题,但如果其他人确实遇到问题,请随时更改它。
答案 0 :(得分:3)
您的程序只在找到结果时输出。它找不到任何。
600851475143的主要因素是71×839×1471×6857。在Facts
中,您只查找大于1000000的因子。
是的,你的暴力方法是通过所有小于目标的数字并检查它们是否是一个因素,然后检查它们是否是素数是一种非常慢的方法。有关更快的算法,请参阅this question。
浮点数在计算中会丢失精度,并且无法保证精确表示大于16777216的整数(可能取决于您的平台)。因此,将fmod
的结果与零相比较,并不能很好地进行。您应始终使用epsilon值来测试浮点数是否接近另一个值。有关详细信息,请参阅Comparing floating point numbers和What Every Computer Scientist Should Know About Floating-Point。
您可以使用long long
代替并使用整数计算。 operator%
可能比fmod
更快。
另外,如果你的程序确实找到了什么,那么它只会输出结果的数组索引,我认为它不是很有用。