我希望找到给定数字的最大质因数。经过几次尝试,我已经改进了测试以处理相当大的数字(即在毫秒内达到十亿级别)。问题是,如果超过十亿,执行时间会变得无限长。我想知道是否可以进行更多的改进并减少执行时间。我希望有更好的执行时间,因为在此链接Prime Factors Calculator中,执行时间非常快。目标数字是600851475143。代码相当自说明。注意:我考虑使用埃拉托色尼筛法算法,但对于执行时间没有什么帮助。
#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;
}
sqrt
是一个浮点函数;您依赖它返回一个精确的结果,但不能保证它会这样做。 - user1084944i * i <= n
并避免使用sqrt
调用。 - Alnitaki <= n / i
避免了整数溢出的问题。 - Will Ness