这有点剧透,所以如果您想自己解决这个问题,请不要阅读此内容:)。我将尝试按顺序提供提示,因此您可以按顺序阅读每个提示,如果您需要更多提示,请移至下一个提示等。
提示 #1:
如果 divisor 是 n 的除数,则 n / divisor 也是 n 的除数。例如,100 / 2 = 50 余数为 0,所以 2 是 100 的除数。但这也意味着 50 是 100 的除数。
提示 #2
给定提示 #1,这意味着我们可以在检查素因数时从 i = 2 循环到 i*i <= n。例如,如果我们检查数字 100,那么我们只需要循环到 10(10*10 <= 100),因为通过使用提示 #1,我们将获得所有因子。那是:
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 的第一个因数就足够了,称之为除数,然后我们可以递归地找到 n / 除数的其他因数。我们可以使用筛分法,并在发现因素时将其标记出来。
提示 #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.