【发布时间】:2015-12-13 13:37:49
【问题描述】:
我一直在尝试破解这个问题:https://codility.com/programmers/task/common_prime_divisors/
我让它在返回正确答案方面发挥作用,但对于更大的数字来说它非常慢,我想看看是否有人更好地更快地完成它或解释我可以优化它的方法。
bool IsPrime(int number)
{
for (int i = 2; i < number; i++)
{
if (number % i == 0)
{
return false;
}
}
return true;
}
bool GetPrimeFactors(int valueA, int valueB)
{
if(valueA < 0 || valueB < 0)
return false;
int max = sqrt(std::max(valueA, valueB)) + 1;//sqrt(std::max(valueA, valueB));
std::vector<int> factors;
bool oneSuccess = false;
for(int i = 2; i <= max; i++)
{
bool remainderA = valueA % i == 0;
bool remainderB = valueB % i == 0;
if(remainderA != remainderB)
return false;
if(IsPrime(i))
{
//bool remainderA = valueA % i == 0;
// bool remainderB = valueB % i == 0;
if(remainderA != remainderB )
{
return false;
}
else if(!oneSuccess && remainderA && remainderB)
{
oneSuccess = true;
}
}
}
return true;
}
int solution(vector<int> &A, vector<int> &B) {
int count = 0;
for(size_t i = 0; i < A.size(); i++)
{
int valA = A[i];
int valB = B[i];
if(GetPrimeFactors(valA, valB))
++count;
}
return count;
}
【问题讨论】:
-
IsPrime函数可以使用常见素数的表查找。如果数字大于最大的素数,则开始筛子(并将新找到的素数附加到表中)。通常,查表比筛子快。
标签: c++ math optimization primes