Вы можете улучшить свою программу, используя один простой трюк:
Каждый раз, когда вы найдете делитель d
, делите свое число на d
.
Это означает, что для каждого найденного делителя , ваш номер становится меньше, что упрощает разложение оставшейся части.
В качестве бонуса это означает, что вам не нужно быть очень осторожным, используя только простые числа в качестве делителей. Каждый раз, когда делитель найден, он является наименьшим делителем текущего числа, а поскольку это наименьший делитель, он должен быть простым. Это сохраняет весь уровень зацикливания.
Факторы извлекаются в порядке от наименьшего к наивысшему, так что в итоге то, что у вас есть, является наивысшим основным фактором - ответом на этот вызов.
Это не быстрый алгоритм, но 600851475143 не является большим числом, и этот алгоритм не станет его фактором.
Например, на идеоне :
for (long long int d = 2; d * d <= a; d++) {
if (a % d == 0) {
a /= d;
d--; // this is to handle repeated factors
}
}
Я также использовал старый d * d <= a
трюк, но он тебе здесь даже не нужен. Помогает, если самый высокий коэффициент высокий, и в этом примере это не так.