Ceci est un peu un spoiler, donc si vous voulez résoudre ce problème vous-même, ne lisez pas encore :). Je vais essayer de fournir des conseils en ordre de succession, de sorte que vous pouvez lire chaque indication dans l'ordre, et si vous avez besoin de plus des conseils, passer à la prochaine indication, etc.
Conseil n ° 1: Si diviseur est un diviseur de n, alors n/diviseur est aussi un diviseur de n. Par exemple, 100/2 = 50 avec le reste 0, donc 2 est un diviseur de 100. Mais cela signifie aussi que 50 est un diviseur de 100.
Astuce # 2 Compte tenu Astuce n ° 1, cela signifie est que nous pouvons boucler de i = 2 à i * i < = n lors de la vérification des facteurs premiers. Par exemple, si nous vérifions le nombre 100, nous n'avons qu'à boucler à 10 (10 * 10 est < = 100) car en utilisant l'indice # 1, nous obtiendrons tous les facteurs. C'est:
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
Conseil n ° 3 Puisque nous soucions que sur les facteurs principaux pour n, il est suffisant de trouver le premier facteur de n, appelez-le diviseur, et alors nous pouvons récursive trouver les autres facteurs pour n/diviseur. Nous pouvons utiliser une approche sieve et marquer les facteurs tels que nous les trouvons.
Conseil n ° 4 solution d'échantillon dans 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;
}
Sortie:
---------- 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.
quelle partie de la sortie est incorrecte? Les facteurs ou le plus grand facteur premier? – WillfulWizard
Pourriez-vous expliquer la logique derrière la vérification si 'b' est un facteur de 3,2 ou 5? – Jacob
@Willfulwizrd: Supposons que si j'entre un nombre supérieur à 51, disons si j'entre 52. Idéalement, il devrait afficher 13 comme le plus grand facteur premier mais il affiche 2 comme réponse. – Khushboo