【发布时间】:2017-01-07 06:37:49
【问题描述】:
我想找到给定数字的最大素数。经过几次尝试,我增强了测试以应对相当大的数字(即高达 10 亿毫秒)。现在的问题是,如果超过 10 亿,执行时间可以说是永远。我想知道我是否可以做更多的改进并减少执行时间。我希望有更好的执行时间,因为在这个链接Prime Factors Calculator 中,执行时间非常快。我此时的目标号码是 600851475143。代码是不言自明的。 注意:我考虑过 Eratosthenes 的 Sieve 算法,但在执行时间方面没有运气。
#include <iostream>
#include <cmath>
bool isPrime(int n)
{
if (n==2)
return true;
if (n%2==0)
return false;
for (int i(3);i<=sqrt(n);i+=2) // ignore even numbers and go up to sqrt(n)
if (n%i==0)
return false;
return true;
}
int main()
{
int max(0);
long long target(600851475143);
if( target%2 == 0 )
max = 2;
for ( int i(3); i<target; i+=2 ){ // loop through odd numbers.
if( target%i == 0 ) // check for common factor
if( isPrime(i) ) // check for prime common factor
max = i;
}
std::cout << "The greatest prime common factor is " << max << "\n";
return 0;
}
【问题讨论】:
-
尝试使用更高级的算法,例如Miller-Rabin primality test。
-
旁白:
sqrt是一个浮点函数;你依赖它返回一个准确的结果,但它不能保证这样做。 -
@Hurkyl 无论如何,他应该测试
i * i <= n并完全避免sqrt调用 -
@Alnitak
i <= n / i避免了整数溢出。 -
这个was asked 285 times 已经在 SO 上,顺便说一句。 :)