これは少しスポイラーなので、これを自分で解決したい場合は、まだ読んではいけません:)。ヒントを順番に提供していきますので、各ヒントを順番に読むことができます。さらにヒントが必要な場合は、次のヒントに移動してください。
ヒント#1:
除数がnの約数である場合、n/除数もnの約数です。たとえば、100/2 = 50で、余りは0なので、2は100の約数です。ただし、これは、50が100の約数であることも意味します。
ヒント#2
ヒント#1が与えられた場合、これは、素因数をチェックするときにi=2からi*i<=nにループできることを意味します。たとえば、数値100をチェックしている場合、ヒント#1を使用するとすべての要素が得られるため、10にループするだけで済みます(10 *10は<=100)。あれは:
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.