Это что-то вроде спойлера, так что если вы хотите решить это самостоятельно, не читайте это пока :).Я постараюсь предоставить подсказки в порядке последовательности, чтобы вы могли прочитать каждую подсказку по порядку, а если вам нужны дополнительные подсказки, перейдите к следующей подсказке и т. Д.
Подсказка № 1: Если делитель является делителем n, то n / делитель также является делителем n.Например, 100/2 = 50 с остатком 0, поэтому 2 - это делитель 100. Но это также означает, что 50 - это делитель 100.
Подсказка # 2 Учитывая Подсказка #1, это означает, что мы можем переходить от i = 2 к i * i <= n при проверке простых факторов.Например, если мы проверяем число 100, то нам нужно только вернуться к 10 (10 * 10 - <= 100), потому что, используя подсказку # 1, мы получим все факторы.То есть: </p>
100 / 2 = 50, so 2 and 50 are factors
100 / 5 = 20, so 5 and 20 are factors
100 / 10 = 10, so 10 is a factor
Подсказка # 3 Поскольку мы заботимся только о простых множителях для n, достаточно просто найти первый множитель n, назвать его делителем, а затем мы можемРекурсивно найти другие факторы для п / делитель.Мы можем использовать подход sieve и отмечать факторы по мере их нахождения.
Подсказка # 4 Пример решения в C
:
bool factors[100000];
void getprimefactors(int n) {
// 0 and 1 are not prime
if (n == 0 || n == 1) return;
// find smallest number >= 2 that is a divisor of n (it will be a prime number)
int divisor = 0;
for(int i = 2; i*i <= n; ++i) {
if (n % i == 0) {
divisor = i;
break;
}
}
if (divisor == 0) {
// we didn't find a divisor, so n is prime
factors[n] = true;
return;
}
// we found a divisor
factors[divisor] = true;
getprimefactors(n / divisor);
}
int main() {
memset(factors,false,sizeof factors);
int f = 1234;
getprimefactors(f);
int largest;
printf("prime factors for %d:\n",f);
for(int i = 2; i <= f/2; ++i) {
if (factors[i]) {
printf("%d\n",i);
largest = i;
}
}
printf("largest prime factor is %d\n",largest);
return 0;
}
Вывод:
---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
prime factors for 1234:
2
617
largest prime factor is 617
> Terminated with exit code 0.